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

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



답변

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

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;

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


답변

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

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

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

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

alter table mytable add column colnew char(50)


답변

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

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

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


답변

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'


답변

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, 배터리가 실행되는 동안 트랜잭션이 발생하는 경우, 예를 들어, 신중하게 처리하지 않을 경우 데이터 손실의 높은 기회가 될 것이다.


답변

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

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

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

cat db.sql | sqlite3 database.db

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


답변