sqlite에서 열을 어떻게 변경합니까? 이것은Postgresql
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
sqlite에는 ALTER COLUMN이 전혀 없으며 ALTER TABLE 만 지원됩니다.
어떤 생각? 감사!
답변
sqlite에는 ALTER COLUMN이 없습니다.
귀하의 유일한 옵션은 다음과 같습니다.
- 테이블 이름을 임시 이름으로 변경
- NOT NULL 제약 조건없이 새 테이블 만들기
- 이전 테이블의 내용을 새 테이블에 복사
- 이전 테이블 제거
이 다른 Stackoverflow 답변 은 프로세스를 자세히 설명합니다.
답변
ALTER COLUMN이 아니라는 것은 사실이지만 열 이름 만 바꾸거나 NOT NULL 제약 조건을 삭제하거나 데이터 유형을 변경하려는 경우 다음과 같은 위험한 명령 집합을 사용할 수 있습니다 .
PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;
스키마에 변경 사항을 다시로드하려면 연결을 닫았다가 다시 열거 나 데이터베이스를 진공 상태로 만들어야합니다.
예를 들면 :
Y:\> **sqlite3 booktest**
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> **create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT
NULL);**
sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**
Error: BOOKS.publication_date may not be NULL
sqlite> **PRAGMA writable_schema = 1;**
sqlite> **UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT
NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';**
sqlite> **PRAGMA writable_schema = 0;**
sqlite> **.q**
Y:\> **sqlite3 booktest**
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**
sqlite> **.q**
참조는 다음과 같습니다.
pragma writable_schema
이 pragma가 켜져 있으면 데이터베이스가 포함 된 SQLITE_MASTER 테이블은 일반 UPDATE, INSERT 및 DELETE 문을 사용하여 변경할 수 있습니다. 경고 :이 pragma를 잘못 사용하면 데이터베이스 파일이 손상 될 수 있습니다.
[alter table] (From http://www.sqlite.org/lang_altertable.html )
SQLite는 ALTER TABLE의 제한된 하위 집합을 지원합니다. SQLite의 ALTER TABLE 명령을 사용하면 사용자가 테이블의 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 열 이름을 바꾸거나 열을 제거하거나 테이블에서 제약 조건을 추가 또는 제거 할 수 없습니다.
답변
SQLite는 ALTER TABLE의 제한된 하위 집합을 지원합니다. SQLite의 ALTER TABLE 명령을 사용하면 사용자가 테이블의 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 열 이름을 바꾸거나 열을 제거하거나 테이블에서 제약 조건을 추가 또는 제거 할 수 없습니다. 그러나 다음 단계에 따라 테이블 열 데이터 유형 또는 기타 속성을 변경할 수 있습니다.
- 거래 시작;
- 임시 테이블 생성 t1_backup (a, b);
- INSERT INTO t1_backup SELECT a, b FROM t1;
- 드롭 테이블 t1;
- 테이블 생성 t1 (a, b);
- INSERT INTO t1 SELECT a, b FROM t1_backup;
- 드롭 테이블 t1_backup;
- 범하다
자세한 내용은 링크를 참조하십시오 .