답변:
두 가지 옵션이 있습니다. 먼저 다음을 사용하여 새 열을 추가 할 수 있습니다.
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;
필요한 경우 모든 이름을 완전히 바꿀 수 있으므로 두 번째 옵션을 선호합니다.
PRAGMA foreign_keys = ON;
( sqlite.org/foreignkeys.html#fk_enable 참조 )
SQL에서 다른 열 사이 에 열 을 추가하지 않고 추가하기 만하면됩니다. 그들이 어디에 두느냐는 전적으로 DBMS에 달려 있습니다. 열이 올바른 순서로 나오도록하는 올바른 장소 select
입니다.
즉, 순서대로 원하면 {name,colnew,qty,rate}
다음을 사용하십시오.
select name, colnew, qty, rate from ...
SQLite를 사용하려면을 사용해야 alter table
합니다.
alter table mytable add column colnew char(50)
SELECT * FROM mytable
?
select *
. 테이블을 발견하려는 프로그램에는 편리하지만 대부분의 경우 원하는 것을 명시 적으로 지정하여 원하는 순서를 지정해야합니다.
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;
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
매우 큰 데이터베이스에서 이것이 얼마나 실현 가능한지 모르겠지만 제 경우에는 효과가있었습니다.