sqlite의 ALTER COLUMN


81

sqlite에서 열을 어떻게 변경합니까? 이것은Postgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

sqlite에는 ALTER COLUMN이 전혀 없으며 ALTER TABLE 만 지원됩니다.

어떤 생각? 감사!


ALTER COLUMN 구문을 요청했지만 원하는 것을 말하지 않았습니다. 이게 너무 광범위하다고 생각하게합니다. ALTER COLUMN은 많은 일을 할 수 있습니다. pg 예제와 같이 not null 제약 조건을 삭제하려고합니까?
Evan Carroll

intellj db 도구를 사용한 경우 열을 변경하면 sqlite에 대한 명령이 생성됩니다.
foolcage

답변:


111

sqlite에는 ALTER COLUMN이 없습니다.

귀하의 유일한 옵션은 다음과 같습니다.

  • 테이블 이름을 임시 이름으로 변경
  • NOT NULL 제약 조건없이 새 테이블 만들기
  • 이전 테이블의 내용을 새 테이블에 복사
  • 이전 테이블 제거

이 다른 Stackoverflow 답변 은 프로세스를 자세히 설명합니다.


64

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 명령을 사용하면 사용자가 테이블의 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 열 이름을 바꾸거나 열을 제거하거나 테이블에서 제약 조건을 추가 또는 제거 할 수 없습니다.

테이블 구문 변경


7
이 방법은 저에게 효과적이지만 열이 다른 순서 (예 : 이전 ADD COLUMN 명령)에있을 수있는 상황을 피하기 위해 다음을 사용했습니다. UPDATE SQLITE_MASTER SET SQL = replace (SQL, '[MyColumn] integer NOT NULL' , '[MyColumn] 정수 NULL') WHERE NAME = 'MyTable'. 또한 트랜잭션의 일부로 실행하지 않도록주의하십시오. 이전 트랜잭션 명령 중 일부가 실행되지 않을 수 있습니다.
Ross

32

SQLite는 ALTER TABLE의 제한된 하위 집합을 지원합니다. SQLite의 ALTER TABLE 명령을 사용하면 사용자가 테이블의 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 열 이름을 바꾸거나 열을 제거하거나 테이블에서 제약 조건을 추가 또는 제거 할 수 없습니다. 그러나 다음 단계에 따라 테이블 열 데이터 유형 또는 기타 속성을 변경할 수 있습니다.

  1. 거래 시작;
  2. 임시 테이블 생성 t1_backup (a, b);
  3. INSERT INTO t1_backup SELECT a, b FROM t1;
  4. 드롭 테이블 t1;
  5. 테이블 생성 t1 (a, b);
  6. INSERT INTO t1 SELECT a, b FROM t1_backup;
  7. 드롭 테이블 t1_backup;
  8. 범하다

자세한 내용은 링크를 참조하십시오 .


테이블 이름을 바꾸려면 : ALTER TABLE table1 RENAME TO table2;
live-love

색인을 잊지 마세요. .schema를 실행하여 인덱스가있는 create 문을 생성합니다.
라이브 러브
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.