[sqlite] 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 SELECT 1 AS c;

SELECT * FROM tab;

ALTER TABLE tab RENAME COLUMN c to c_new;

SELECT * FROM tab;

db-fiddle.com 데모


안드로이드 지원

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

ALTER TABLE SYNTAX


답변

최근에는 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 명령 만 포함되어 있습니다.

바라건대, 그것은 사람들의 시간을 절약 해줍니다.