문제

내가 이름을 변경해야 하는 열에 일부 테이블에서 SQLite 데이터베이스입니다.나는 알 비슷한 질문 요청 되었습에서 유래 이전에,하지만 그것은 SQL 에 대한 일반적인 케이스의 SQLite 언급되지 않았다.

에서 SQLite 에 대한 문서 ALTER TABLE, 에,나는 수집하지 않다는 가능한 것은"쉽게"(즉단일 ALTER TABLE 문).

제가 궁금했던 사람을 알고의 일반 SQL 의 방법으로 이러한 일을 하는 SQLite.

도움이 되었습니까?

해결책

이것은 단지 고정되었습니다 2018-09-15 (3.25.0)

향상 ALTER TABLE 명령:

  • 테이블 내에서 개 이름을 바꾸는 열에 대한 지원을 추가하십시오 ALTER TABLE 테이블 RENAME COLUMN oldname TO newname.
  • 수정 테이블 이름 바꾸기 기능으로 이름이 바뀌는 테이블에 대한 참조를 트리거 및 뷰로 업데이트합니다.

아래에 문서화 된 새로운 구문을 찾을 수 있습니다 ALTER TABLE

그만큼 RENAME COLUMN TO 구문은 테이블 테이블 이름의 열 이름을 New-Column-Name으로 변경합니다. 열 이름은 테이블 정의 자체 내에서 그리고 열을 참조하는 모든 인덱스, 트리거 및 뷰 내에서 변경됩니다. 열 이름이 변경되면 트리거 또는 뷰에서 의미 론적 모호성이 발생하면 RENAME COLUMN 오류가 발생하지 않고 변경 사항이 적용되지 않습니다.

enter image description here 이미지 출처 : 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;

DB-Fiddle.com 데모


안드로이드 지원

글을 쓰는 시점에서 Android의 API 27은 SQLITE 패키지 버전 3.19를 사용합니다..

Android가 사용하고있는 현재 버전 과이 업데이트가 SQLite의 버전 3.25.0에 나오고 있다는 사실을 기반으로,이를 지원하기 전에 대기 중 대기 (대략 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; 아마도 좋은 생각 일 것입니다.

ALTER 열이 없다는 것은 사실이지만 열의 이름을 바꾸거나 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가 켜져 있으면 일반적인 업데이트, 삽입 및 삭제를 사용하여 데이터베이스를 변경할 수있는 SQLITE_MASTOR 테이블이 있습니다. 경고 :이 Pragma의 오용은 쉽게 손상된 데이터베이스 파일을 초래할 수 있습니다.

변경 테이블
SQLITE는 조정 테이블의 제한된 서브 세트를 지원합니다. SQLITE의 Alter Table 명령을 통해 사용자는 테이블 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 열 이름을 바꾸거나 열을 제거하거나 테이블에서 제약 조건을 추가하거나 제거 할 수 없습니다.

ALTER TABLE SYNTAX

파기, 나는이 multiplatform (linux | mac | windows) 그래픽 도구를 발견했다. SQLITE 용 DB 브라우저 실제로 매우 사용자 친화적 인 방식으로 열을 바꿀 수 있습니다!

편집 | 테이블 수정 | 선택 테이블 | 필드 편집. 클릭을 클릭하십시오! 짜잔!

그러나 누군가가 프로그래밍 방식의 방식을 공유하고 싶다면 기꺼이 알게 될 것입니다!

최근에 나는 이름이 지정된 테이블과 함께 sqlite3에서 그것을해야했습니다. 포인트들 Colunms와 함께 ID, LON, LAT. erroneusly, 테이블이 가져 오면 위도 값은 열과 그 반대의 경우, 그 열의 이름을 바꾸는 것이 명백한 수정입니다. 그래서 트릭은 다음과 같습니다.

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는 조정 테이블의 제한된 서브 세트를 지원합니다. SQLITE의 Alter Table 명령을 통해 사용자는 테이블 이름을 바꾸거나 기존 테이블에 새 열을 추가 할 수 있습니다. 콜럼의 이름을 바꾸거나 열을 제거하거나 테이블에서 제약 조건을 추가하거나 제거 할 수 없습니다.

물론 당신이 할 수있는 일은 새 레이아웃으로 새 테이블을 만드는 것입니다. SELECT * FROM old_table, 그리고 당신이받을 수있는 값으로 새 테이블을 채우십시오.

우선, 이것은 놀랍게도 얼굴을 때리는 것들 중 하나입니다. 칼럼의 이름을 바꾸는 것은 완전히 새 테이블을 만들고 이전 테이블에서 새 테이블로 데이터를 복사해야합니다 ...

내가 sqlite 운영을하기 위해 착륙 한 GUI는 베이스. 실행 된 모든 명령을 표시하는 멋진 로그 창이 있습니다. 베이스를 통해 열 이름 바꾸면 로그 창이 필요한 명령으로 채워집니다.

Base log window

그런 다음 필요한 곳에 쉽게 복사하고 붙여 넣을 수 있습니다. 나를 위해, 그것은 속에 있습니다 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 데이터베이스는 브라우저는 않는다.Lyckily,이 툴은 로그를 유지 모두 수행된 작업 또는 사용자가 응용 프로그램.이렇게 한 번 찾고 응용 프로그램에서 로그,당신은 코드가 참여했다.사본을 쿼리를 붙여 넣으로 필요합니다.나를 위해 일했습니다.이

원하는 열 이름 인 Colnew가있는 새 열을 만듭니다.

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

오래된 열의 목차를 새 열 colnew에 복사하십시오.

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

참고 : 괄호는 위의 라인에서 필요합니다.

공식 문서에서

더 단순하고 빠른 절차 어떤 방식 으로든 온 디스크 내용에 영향을 미치지 않는 일부 변경에 선택적으로 사용할 수 있습니다. 다음 간단한 절차는 점검 또는 외국 키 제거에 적합하거나 널 제약 조건을 제거하는 데 적합합니다. 열 이름 변경, 열에서 기본값을 추가하거나 제거하거나 변경합니다.

  1. 거래를 시작하십시오.

  2. Pragma Schema_version을 실행하여 현재 스키마 버전 번호를 결정하십시오. 이 숫자는 아래 6 단계에 필요합니다.

  3. pragma ritable_schema = on을 사용하여 스키마 편집을 활성화하십시오.

  4. sqlite_mas

    주의 : SQLITE_MASTER 테이블을 변경하면 변경 사항에 구문 오류가 포함 된 경우 데이터베이스가 손상되고 읽을 수 없습니다. 중요한 데이터가 포함 된 데이터베이스에서 사용하기 전에 별도의 빈 데이터베이스에서 업데이트 문을 신중하게 테스트 할 것을 제안합니다.

  5. 표 X 로의 변경이 다른 테이블 또는 인덱스 또는 트리거에 영향을 미치는 경우 스키마 내의 뷰 인 경우 업데이트 문을 실행하여 다른 테이블 인덱스 및 뷰도 수정하십시오. 예를 들어, 열의 이름이 변경되면 해당 열을 참조하는 모든 외래 키 제약, 트리거, 인덱스 및 뷰를 수정해야합니다.

    주의 : 다시 한 번, SQLITE_MASTER 테이블을 변경하면 변경에 오류가 포함 된 경우 데이터베이스가 손상되고 읽을 수 없습니다. 중요한 데이터가 포함 된 데이터베이스에서 사용하기 전에 별도의 테스트 데이터베이스 에서이 전체 절차를주의 깊게 테스트 하거나이 절차를 실행하기 전에 중요한 데이터베이스의 백업 사본을 작성하십시오.

  6. Pragma schema_version = x를 사용하여 스키마 버전 번호를 증가시킵니다.

  7. pragma ritable_schema = off를 사용하여 스키마 편집을 비활성화합니다.

  8. (선택 사항) 스키마 변경으로 인해 데이터베이스가 손상되지 않았는지 확인하기 위해 Pragma Integrity_check을 실행하십시오.

  9. 위의 1 단계에서 시작된 거래를 커밋하십시오.

하나의 옵션, 핀치로 완료 해야하는 경우, 기본값으로 초기 열이 생성 된 경우 원하는 새 열을 만들고 내용을 복사 한 다음 기본적으로 기존 열을 "포기"하는 것입니다 (유지 존재하지만, 당신은 그것을 사용/업데이트하지 않습니다.)

전:

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

이로 인해 열이 나고 (그리고 기본값이 없지만 기본값없이 만들어 졌다면, 실패 할 수있는 미래의 삽입물이 실패 할 수 있습니다), 단지 끔찍한 테이블이라면 트레이드 오프가 허용 될 수 있습니다. 그렇지 않으면 여기에 언급 된 다른 답변 중 하나 또는 열의 이름을 바꿀 수있는 다른 데이터베이스를 사용하십시오.

사례 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;

참고 : 위 명령은 모두 한 줄 여야합니다.

Step 4: 원래 테이블을 떨어 뜨립니다.

DROP TABLE student_temp;

이 네 단계를 사용하면 SQLITE 테이블을 수동으로 변경할 수 있습니다. 새 테이블에서 인덱스, 시청자 또는 트리거를 재현해야합니다.

버전 2018-09-15 (3.25.0) SQLITE는 열 변경을 지원합니다.

https://sqlite.org/changes.html

sqlite3 yourdb .dump> /tmp/db.txt
생성 라인에서 /tmp/db.txt CHANCER 이름을 편집합니다
sqlite2 yourdb2 </tmp/db.txt
MV/이동 YourDB2 YourDB를 이동합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top