sqlite의 테이블에 새 열을 삽입 하시겠습니까?


354

나는 열이있는 테이블이 name, qty, rate. 이제 와 열 COLNew사이에 새 열을 추가해야합니다 . 두 열 사이에 새 열을 어떻게 추가합니까?nameqty

답변:


677

두 가지 옵션이 있습니다. 먼저 다음을 사용하여 새 열을 추가 할 수 있습니다.

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

둘째, 더 복잡하지만 실제로 원하는 열을 배치하려면 테이블 이름을 바꾸는 것이 좋습니다.

ALTER TABLE {tableName} RENAME TO TempOldTable;

그런 다음 누락 된 열이있는 새 테이블을 작성하십시오.

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);

그리고 이전 데이터로 채 웁니다.

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;

그런 다음 이전 테이블을 삭제하십시오.

DROP TABLE TempOldTable;

필요한 경우 모든 이름을 완전히 바꿀 수 있으므로 두 번째 옵션을 선호합니다.


26
첫 번째 옵션을 선택하고 secend 옵션 ALTER TABLE {tableName} ADD COLUMN COLNew {type} DEFAULT {defaultValue}; 더 중요한 : (열을 주문하려는 이유에 대해 생각하십시오.) 모든 레코드 작업 (삽입 또는 추가와 같은)에서 항상 열 이름을 사용하면 테이블을 변경 한 후 코드에서 실수가 발생하지 않습니다.
michel.iamit

5
그런데 일부 필드 유형의 경우 ALTER TABLE에 기본값을 추가 할 수 없습니다. sqlite.org/lang_altertable.html
michel.iamit

9
인덱스를 다시 작성하는 것을 잊지 마십시오
Jan Turoň

5
또한 트리거를 다시 만들어야합니다.
Christopher K.

7
외래 키로 인한 잠재적 제약 조건 위반을 잊지 마십시오. "... 외래 키 작업 또는 제약 조건 위반이 발생할 수 있습니다." ( sqlite.org/foreignkeys.html#fk_schemacommands 참조 ); 해결 방법으로 외래 키를 비활성화 할 수 있습니다 : PRAGMA foreign_keys = ON;( sqlite.org/foreignkeys.html#fk_enable 참조 )
Trinimon

112

SQL에서 다른 열 사이 에 열 추가하지 않고 추가하기 만하면됩니다. 그들이 어디에 두느냐는 전적으로 DBMS에 달려 있습니다. 열이 올바른 순서로 나오도록하는 올바른 장소 select입니다.

즉, 순서대로 원하면 {name,colnew,qty,rate}다음을 사용하십시오.

select name, colnew, qty, rate from ...

SQLite를 사용하려면을 사용해야 alter table합니다.

alter table mytable add column colnew char(50)

2
SELECT * FROM mytable?
EML

새 열의 기존 행에 지정하지 않으면 기본값이 무엇입니까?
Jacob

12
수행해야 할 사용 사례는 거의 없습니다 select *. 테이블을 발견하려는 프로그램에는 편리하지만 대부분의 경우 원하는 것을 명시 적으로 지정하여 원하는 순서를 지정해야합니다.
paxdiablo

4
이것이 "허용 된 대답"이 아닌 것은 미친 짓입니다. 원래 질문 자체는 RDBMS 작동 방식에 대한 완전한 이해 부족을 보여줍니다.
Vada Poché

12

검색어로 새 열을 추가 할 수 있습니다

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

그러나 기존 열 사이가 아닌 끝에 추가됩니다.


11

SQLite에는 테이블 끝에 열을 추가하거나 테이블 이름을 변경하는 데 사용할 수있는 ALTER TABLE 지원이 제한되어 있습니다.

테이블 구조를보다 복잡하게 변경하려면 테이블을 다시 작성해야합니다. 기존 데이터를 임시 테이블에 저장하고 이전 테이블을 삭제하고 새 테이블을 만든 다음 데이터를 임시 테이블에서 다시 복사 할 수 있습니다.

예를 들어, 열 이름이 "a"및 "c"인 "t1"이라는 테이블이 있고이 테이블에서 "b"열을 삽입한다고 가정하십시오. 다음 단계는이를 수행하는 방법을 보여줍니다.

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

이제 다음과 같이 새 데이터를 삽입 할 준비가되었습니다.

UPDATE t1 SET b='blah' WHERE a='key'

내 테스트에서 행 INSERT INTO t1 SELECT a,c FROM t1_backup;은 "테이블 t1에 3 개의 열이 있지만 2 개의 값이 제공되었습니다. INSERT INTO t1 SELECT a, c FROM t1_backup;". 올바른 줄은 다음과 같아야합니다INSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
JnLlnd

5
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

이 업데이트는 null 값을 처리하고 필요에 따라 기본값을 입력해야합니다. 귀하의 경우와 마찬가지로 SELECT쿼리 를 호출해야 하며 paxdiablo가 이미 말했듯 이 열 순서를 얻습니다 .

SELECT name, colnew, qty, rate FROM{tablename}

내 의견으로는 커서에서 값을 가져 오는 열 이름 :

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));

따라서 인덱스가 변경되면 응용 프로그램에 문제가 발생하지 않습니다.

당신이 사용하는 경우에, 그 다른 의미에서 안전한 방법입니다 CREATE temptable거나 RENAME table또는 CREATE, 배터리가 실행되는 동안 트랜잭션이 발생하는 경우, 예를 들어, 신중하게 처리하지 않을 경우 데이터 손실의 높은 기회가 될 것이다.


4

나는 같은 문제에 직면 해 있었고 주석에서 언급했듯이 허용 된 답변에서 제안 된 두 번째 방법은 외래 키를 다룰 때 문제가 될 수 있습니다.

해결 방법은 데이터베이스를 sql 파일로 내보내 INSERT 문에 열 이름이 포함되어 있는지 확인하는 것입니다. 편리한 기능이있는 SQLite 용 DB 브라우저를 사용하여 수행합니다 . 그런 다음 create table 문을 편집하고 원하는 곳에 새 열을 삽입하고 db를 다시 만들어야합니다.

* nix와 같은 시스템에서 시스템은

cat db.sql | sqlite3 database.db

매우 큰 데이터베이스에서 이것이 얼마나 실현 가능한지 모르겠지만 제 경우에는 효과가있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.