SQLITE3 및 ALTER TABLE .. 후
-
18-09-2019 - |
문제
사전 정의 된 스키마와 일치하도록 최근 SQLITE 버전에서 테이블을 수정하는 간단한 방법이 있습니까?
개요:
war_id INTEGER NOT NULL,
clanname VARCHAR(64),
clanhomepage VARCHAR(128),
date DATETIME,
server VARCHAR(64),
warmode_id INTEGER,
squad_id INTEGER,
notes TEXT, clantag String(16),
PRIMARY KEY (war_id),
FOREIGN KEY(warmode_id) REFERENCES warmodes (warmode_id),
FOREIGN KEY(squad_id) REFERENCES squads (squad_id),
FOREIGN KEY(orgamember_id) REFERENCES users (user_id)
이제 Clanname 후 Clantag Varchar (16)를 삽입하여 다른 설정과 일치합니다.
나는 내보내기, 도랑, 재현을 신경 쓰지 않지만 다른 SQL 데이터베이스가 처리 할 수있는 경우, 그 없이도 그렇게 할 수있는 옵션이 있는지 궁금합니다 ...
해결책
SQLITE는 열을 추가하는 것을 지원합니다 여기에 표시됩니다. 당신이 직면하게 될 유일한 제한은 열이 테이블의 끝에 있다는 것입니다. 그러나 정상적인 사용 열 순서의 경우 문제가되지 않아야합니다. 대체 솔루션은 새 정의로 새 테이블을 만들고 모든 데이터를 삽입하고 이전 테이블을 떨어 뜨린 다음 새 테이블의 이름을 바꾸는 것입니다.
BEGIN TRANSACTION;
CREATE TABLE War_TMP(
war_id INTEGER NOT NULL,
clanname VARCHAR(64),
clantag VARCHAR(16),
clanhomepage VARCHAR(128),
date DATETIME,
server VARCHAR(64),
warmode_id INTEGER,
squad_id INTEGER,
notes TEXT,
PRIMARY KEY (war_id),
FOREIGN KEY(warmode_id) REFERENCES warmodes (warmode_id),
FOREIGN KEY(squad_id) REFERENCES squads (squad_id),
FOREIGN KEY(orgamember_id) REFERENCES users (user_id)
);
INSERT INTO War_TMP() SELECT war_id, clanname, "", clanhomepage,date,server,warmode_id,squad_id,notes FROM War;
DROP TABLE War;
ALTER TABLE War_TMP RENAME TO War;
COMMIT;
제휴하지 않습니다 StackOverflow