SQLite 데이터베이스 테이블에서 열의 이름을 바꾸려면 어떻게합니까?
SQLite 데이터베이스의 일부 테이블에서 몇 개의 열의 이름을 바꿔야합니다. 나는 이전에 stackoverflow에 대해 비슷한 질문 을 받았지만 일반적으로 SQL에 대한 것이 었으며 SQLite의 경우는 언급되지 않았습니다.
ALTER TABLE에 대한 SQLite 문서에서 "쉽게"그러한 일을 할 수 없다는 것을 모았습니다 (즉, 단일 ALTER TABLE 문).
누군가 SQLite로 그러한 일을하는 일반적인 SQL 방법을 알고 궁금했습니다.
이것은 2018-09-15 (3.25.0)로 수정되었습니다.
ALTER TABLE
명령을 향상시킵니다 .
- table을 사용하여
ALTER TABLE
테이블 내에서 열 이름 바꾸기에 대한 지원을 추가하십시오RENAME COLUMN oldname TO newname
.- 테이블 이름 바꾸기 기능을 수정하여 트리거 및보기에서 이름이 바뀐 테이블에 대한 참조도 업데이트합니다.
아래에 문서화 된 새 구문을 찾을 수 있습니다 ALTER TABLE
이
RENAME COLUMN TO
구문은 table-name 테이블의 column-name을 new-column-name으로 변경합니다. 열 이름은 테이블 정의 자체와 열을 참조하는 모든 인덱스, 트리거 및보기 내에서 변경됩니다. 열 이름 변경으로 인해 트리거 또는 뷰에서 의미 상 모호성이RENAME COLUMN
발생하면 오류와 함께 실패하고 변경 사항이 적용되지 않습니다.
이미지 출처 : https://www.sqlite.org/images/syntax/alter-table-stmt.gif
예:
CREATE TABLE tab AS VALUES(1);
SELECT * FROM tab;
ALTER TABLE tab RENAME TO tab_new;
SELECT * FROM tab_new;
안드로이드 지원
작성 당시 Android API 27은 SQLite 패키지 버전 3.19를 사용하고 있습니다.
Android가 현재 사용하고 있으며이 업데이트가 SQLite 버전 3.25.0에서 제공되고 있음을 기반으로 Android에 대한 지원이 추가되기 전에 약간의 대기 시간 (약 API 33)이 있다고 말하고 싶습니다.
그럼에도 불구하고 API 33보다 오래된 버전을 지원해야하는 경우이를 사용할 수 없습니다.
테이블이 있고 "colb"의 이름을 "col_b"로 바꿔야한다고 가정하십시오.
먼저 이전 테이블의 이름을 바꿉니다.
ALTER TABLE orig_table_name RENAME TO tmp_table_name;
그런 다음 이전 테이블을 기반으로하지만 업데이트 된 열 이름을 사용하여 새 테이블을 만듭니다.
CREATE TABLE orig_table_name (
col_a INT
, col_b INT
);
그런 다음 원래 테이블에서 내용을 복사하십시오.
INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;
마지막으로 이전 테이블을 삭제하십시오.
DROP TABLE tmp_table_name;
A의 모든 포장 BEGIN TRANSACTION;
및 것은 COMMIT;
도 아마 좋은 아이디어이다.
파고 들자, 실제로 SQLite 용 DB 브라우저 라는이 다중 플랫폼 (Linux | Mac | Windows) 그래픽 도구를 사용하여 실제로 매우 사용자 친화적 인 방식으로 열의 이름을 바꿀 수 있습니다!
편집 | 테이블 수정 | 테이블 | 필드 편집 클릭 클릭! 짜잔!
그러나 누군가 프로그램 방식으로 공유하고 싶다면 기꺼이 알고 싶습니다.
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가 설정되면 일반 UPDATE, INSERT 및 DELETE 문을 사용하여 데이터베이스를 변경할 수있는 SQLITE_MASTER 테이블. 경고 :이 pragma를 잘못 사용하면 데이터베이스 파일이 쉽게 손상 될 수 있습니다.
alter table
SQLite는 ALTER TABLE의 제한된 하위 집합을 지원합니다. SQLite의 ALTER TABLE 명령을 사용하면 테이블 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 열 이름을 바꾸거나 열을 제거하거나 테이블에서 제약 조건을 추가하거나 제거 할 수 없습니다.
최근에는 SQLite3 에서 colunms id, lon, lat으로 points 포인트 라는 테이블을 사용 하여이 작업을 수행해야했습니다 . 잘못, 테이블을 가져올 때 lon 열에 저장된 위도의 값 과 그 반대 의 값은 해당 열의 이름을 바꾸는 것이 분명합니다. 트릭은 다음과 같습니다.
create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;
나는 이것이 당신에게 도움이되기를 바랍니다!
sqlite 문서 인용 :
SQLite는 ALTER TABLE의 제한된 하위 집합을 지원합니다. SQLite의 ALTER TABLE 명령을 사용하면 테이블 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 열의 이름을 바꾸거나 열을 제거하거나 테이블에서 제한 조건을 추가 또는 제거 할 수 없습니다.
당연히 할 수있는 일은 새로운 레이아웃으로 SELECT * FROM old_table
새 테이블을 만들고받는 값으로 새 테이블을 채우는 것입니다.
우선, 이것은 놀랍게도 나를 놀라게하는 것들 중 하나입니다. 열의 이름을 바꾸려면 완전히 새로운 테이블을 만들고 이전 테이블의 데이터를 새 테이블로 복사해야합니다 ...
SQLite 작업을 수행하기 위해 방문한 GUI는 Base 입니다. 실행 된 모든 명령을 보여주는 멋진 로그 창이 있습니다. Base를 통해 열의 이름을 바꾸면 필요한 명령으로 로그 창이 채워집니다.
그런 다음 필요한 곳에 쉽게 복사하여 붙여 넣을 수 있습니다. 저에게는 ActiveAndroid 마이그레이션 파일이 있습니다. 또한 복사 된 데이터에는 타임 스탬프 등이 아닌 SQLite 명령 만 포함되어 있다는 점이 좋습니다.
바라건대, 그것은 사람들의 시간을 절약 해줍니다.
테이블 열 <id>를 <_id>로 변경
String LastId = "id";
database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
+"("
+ PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
+ PhraseContract.COLUMN_PHRASE + " text ,"
+ PhraseContract.COLUMN_ORDER + " text ,"
+ PhraseContract.COLUMN_FROM_A_LANG + " text"
+")"
);
database.execSQL("INSERT INTO " +
PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
" SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
" FROM " + PhraseContract.TABLE_NAME + "old");
database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");
앞에서 언급했듯이 SQLite Database Browser 도구가 있습니다. 이 도구는 사용자 나 응용 프로그램이 수행 한 모든 작업을 기록합니다. 이 작업을 한 번 수행하고 응용 프로그램 로그를 보면 관련 코드가 표시됩니다. 쿼리를 복사하고 필요에 따라 붙여 넣습니다. 나를 위해 일했다. 도움이 되었기를 바랍니다
원하는 열 이름으로 새 열을 작성하십시오 (COLNew).
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
이전 열 COLOld의 내용을 새 열 COLNew에 복사하십시오.
INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}
참고 : 위 줄에는 괄호가 필요합니다.
디스크 내용에 영향을 미치지 않는 일부 변경 사항 에는 더 간단하고 빠른 절차 를 선택적으로 사용할 수 있습니다. 다음의 간단한 절차는 CHECK 또는 FOREIGN KEY 또는 NOT NULL 제약 조건 제거, 열 이름 바꾸기 또는 열의 기본값 추가 또는 제거 또는 변경에 적합합니다.
거래를 시작하십시오.
PRAGMA schema_version을 실행하여 현재 스키마 버전 번호를 판별하십시오. 이 번호는 아래 6 단계에 필요합니다.
PRAGMA writable_schema = ON을 사용하여 스키마 편집을 활성화하십시오.
UPDATE 문을 실행하여 sqlite_master 테이블에서 테이블 X의 정의를 변경하십시오. UPDATE sqlite_master SET sql = ... WHERE type = 'table'AND name = 'X';
주의 : sqlite_master 테이블을 이와 같이 변경하면 변경에 구문 오류가 포함 된 경우 데이터베이스가 손상되어 읽을 수 없게됩니다. 중요한 데이터가 포함 된 데이터베이스에서 UPDATE 문을 사용하기 전에 별도의 빈 데이터베이스에서 UPDATE 문을 신중하게 테스트하는 것이 좋습니다.
테이블 X에 대한 변경 사항이 다른 테이블에 영향을 주거나 스키마 내의 뷰 또는 트리거가 뷰인 경우 UPDATE 문을 실행하여 다른 테이블 인덱스 및 뷰도 수정하십시오. 예를 들어 열 이름이 변경되면 해당 열을 참조하는 모든 FOREIGN KEY 제약 조건, 트리거, 인덱스 및 뷰를 수정해야합니다.
주의 : sqlite_master 테이블을 이와 같이 변경하면 변경 사항에 오류가있는 경우 데이터베이스가 손상되어 읽을 수 없게됩니다. 이 절차를 실행하기 전에 중요한 데이터가 포함 된 데이터베이스에서 사용하기 전에 별도의 테스트 데이터베이스에서이 전체 절차를 신중하게 테스트하고 /하거나 중요한 데이터베이스의 백업 사본을 만드십시오.
PRAGMA schema_version = X를 사용하여 스키마 버전 번호를 늘리십시오. 여기서 X는 위의 2 단계에서 찾은 이전 스키마 버전 번호보다 하나 더 많습니다.
PRAGMA writable_schema = OFF를 사용하여 스키마 편집을 비활성화하십시오.
(선택 사항) PRAGMA integrity_check를 실행하여 스키마 변경 사항이 데이터베이스를 손상시키지 않았는지 확인하십시오.
위의 1 단계에서 시작된 트랜잭션을 커미트하십시오.
사례 1 : SQLite 3.25.0+
SQLite 버전 3.25.0 만 열 이름 변경을 지원합니다. 장치가이 요구 사항을 충족하는 경우 상황이 매우 간단합니다. 아래 쿼리는 문제를 해결합니다.
ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";
사례 2 : SQLite 이전 버전
약간 까다로울 수있는 결과를 얻으려면 다른 접근법을 따라야합니다.
예를 들어 다음과 같은 테이블이있는 경우
CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)
그리고 열 이름을 변경하려면 Location
1 단계 : 원래 테이블 이름을 바꿉니다.
ALTER TABLE student RENAME TO student_temp;
2 단계 : 이제 student
올바른 열 이름 으로 새 테이블 을 만듭니다 .
CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)
3 단계 : 원래 테이블에서 새 테이블로 데이터를 복사하십시오.
INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;
참고 : 위 명령은 모두 한 줄이어야합니다.
4 단계 : 원본 테이블을 삭제합니다.
DROP TABLE student_temp;
이 네 단계를 통해 SQLite 테이블을 수동으로 변경할 수 있습니다. 새 테이블에서 인덱스, 뷰어 또는 트리거도 다시 작성해야합니다.
한 가지 옵션은 핀치 작업이 필요하고 초기 열이 기본값으로 작성된 경우 원하는 새 열을 작성하고 내용을 복사하고 기본적으로 이전 열을 "버림"하는 것입니다. 존재하지만 사용하거나 업데이트하지는 않습니다.)
전의:
alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically
이것은 열 뒤에 남습니다 (그리고 NOT NULL로 작성되었지만 기본값이 없으면 열을 무시하는 미래의 삽입은 실패 할 수 있습니다). 단지 테이블 인 경우 트레이드 오프가 허용 될 수 있습니다. 그렇지 않으면 여기에 언급 된 다른 답변 중 하나 또는 열의 이름을 바꿀 수있는 다른 데이터베이스를 사용하십시오.
버전 2018-09-15 (3.25.0)부터 sqlite는 열 이름 변경을 지원합니다
https://sqlite.org/changes.html
sqlite3 yourdb .dump> /tmp/db.txt
편집 /tmp/db.txt 편집 행에서 열 이름 변경
sqlite2 yourdb2 </tmp/db.txt
mv / move yourdb2 yourdb
참고 URL : https://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table
'IT' 카테고리의 다른 글
React에서 부모의 상태를 업데이트하는 방법은 무엇입니까? (0) | 2020.03.22 |
---|---|
전체 디렉토리에서 dos2unix를 어떻게 실행할 수 있습니까? (0) | 2020.03.22 |
SqLite에서 Top 5 레코드를 얻는 방법? (0) | 2020.03.22 |
매일 오전 2시 30 분에 크론 작업 실행 (0) | 2020.03.22 |
부트 스트랩 4 네비게이션 바 항목을 오른쪽에 정렬 (0) | 2020.03.22 |