[SQL] 어떻게 기존 SQLite는 테이블에 외래 키를 추가하는 방법은 무엇입니까?
SQL어떻게 기존 SQLite는 테이블에 외래 키를 추가하는 방법은 무엇입니까?
나는 다음과 같은 테이블이 있습니다 :
CREATE TABLE child(
id INTEGER PRIMARY KEY,
parent_id INTEGER,
description TEXT);
어떻게 PARENT_ID에 외래 키 제약 조건을 추가하는 방법은 무엇입니까? 가정 외래 키가 활성화됩니다.
대부분의 예는 테이블을 만드는 가정 - 내가 기존에 제약 조건을 추가하고 싶습니다.
해결법
-
==============================
1.당신은 할 수 없습니다.
당신은 할 수 없습니다.
는 SQL-92 구문이 될 것 테이블에 외부 키를 추가 할 수 있지만으로 다음과 같습니다 :
ALTER TABLE child ADD CONSTRAINT fk_child_parent FOREIGN KEY (parent_id) REFERENCES parent(id);
SQLite는이 ALTER TABLE 명령의 ADD 제약 변형을 지원하지 않습니다 (sqlite.org는 : SQL SQLite는 비 음주자 구현하지 않는 것이 특징).
따라서, SQLite는 3.6.1에서 외부 키를 추가 할 수있는 유일한 방법은 다음과 같이 표를 작성 중에 있습니다 :
CREATE TABLE child ( id INTEGER PRIMARY KEY, parent_id INTEGER, description TEXT, FOREIGN KEY (parent_id) REFERENCES parent(id) );
불행하게도 당신이 임시 테이블에 기존 데이터를 저장 기존 테이블을 삭제의 FK 제약 조건으로 새 테이블을 만들어야합니다, 다음 임시 테이블에서의 데이터 다시 복사합니다. (sqlite.org - FAQ : Q11)
-
==============================
2.당신은 당신이 테이블을 변경할 경우 제약 조건을 추가하고 제약 조건을 사용하는 열을 추가 할 수 있습니다.
당신은 당신이 테이블을 변경할 경우 제약 조건을 추가하고 제약 조건을 사용하는 열을 추가 할 수 있습니다.
첫째, PARENT_ID없이 테이블을 만들 :
CREATE TABLE child( id INTEGER PRIMARY KEY, description TEXT);
그런 다음, 테이블 변경 :
ALTER TABLE child ADD COLUMN parent_id INTEGER REFERENCES parent(id);
-
==============================
3.https://www.sqlite.org/lang_altertable.html#otheralter을 확인하시기 바랍니다
https://www.sqlite.org/lang_altertable.html#otheralter을 확인하시기 바랍니다
-
==============================
4.당신이 파이어 폭스 애드온 sqlite가 매니저를 사용하는 경우 다음을 수행 할 수 있습니다 :
당신이 파이어 폭스 애드온 sqlite가 매니저를 사용하는 경우 다음을 수행 할 수 있습니다 :
대신 삭제하고 다시 테이블을 만드는 하나는 다음과 같이 수정할 수 있습니다.
열 텍스트 상자에서 마우스 오른쪽 컨텍스트 메뉴를 불러와 편집 열을 선택 나열된 마지막 열 이름을 클릭합니다. 테이블 정의의 마지막 열이 PRIMARY KEY 인 경우 먼저 새 열을 추가 한 다음 FOREIGN KEY 정의를 추가하기 위해 새로운 열의 열 유형을 편집 할 필요가 않습니다. 열 유형 상자 내에서 쉼표과를 추가
FOREIGN KEY (parent_id) REFERENCES parent(id)
데이터 유형 후 정의. 변경 버튼을 클릭 한 후 위험 작업 대화 상자에서 예 버튼을 클릭합니다.
참고: SQLite는 관리자
-
==============================
5.예, 당신이 할 수있는, 새로운 열을 추가하지 않고. 당신은 당신이 완전히이를 시도하기 전에 데이터베이스를 백업해야하므로, 데이터베이스를 손상하지 않도록하기 위해 제대로 할 조심해야합니다.
예, 당신이 할 수있는, 새로운 열을 추가하지 않고. 당신은 당신이 완전히이를 시도하기 전에 데이터베이스를 백업해야하므로, 데이터베이스를 손상하지 않도록하기 위해 제대로 할 조심해야합니다.
특정 예를 들어 :
CREATE TABLE child( id INTEGER PRIMARY KEY, parent_id INTEGER, description TEXT ); --- create the table we want to reference create table parent(id integer not null primary key); --- now we add the foreign key pragma writable_schema=1; update SQLITE_MASTER set sql = replace(sql, 'description TEXT)', 'description TEXT, foreign key (parent_id) references parent(id))' ) where name = 'child' and type = 'table'; --- test the foreign key pragma foreign_keys=on; insert into parent values(1); insert into child values(1, 1, 'hi'); --- works insert into child values(2, 2, 'bye'); --- fails, foreign key violation
또는 더 일반적으로 :
pragma writable_schema=1; // replace the entire table's SQL definition, where new_sql_definition contains the foreign key clause you want to add UPDATE SQLITE_MASTER SET SQL = new_sql_definition where name = 'child' and type = 'table'; // alternatively, you might find it easier to use replace, if you can match the exact end of the sql definition // for example, if the last column was my_last_column integer not null: UPDATE SQLITE_MASTER SET SQL = replace(sql, 'my_last_column integer not null', 'my_last_column integer not null, foreign key (col1, col2) references other_table(col1, col2)') where name = 'child' and type = 'table'; pragma writable_schema=0;
어느 쪽이든, 당신은 아마 당신이 어떤 변경하기 전에 먼저 SQL 정의가 무엇인지보고 싶을 것이다 :
select sql from SQLITE_MASTER where name = 'child' and type = 'table';
당신이이 () 접근 방식을 대체 사용하는 경우, 당신은 첫 번째 테스트를 실행하여 대체 () 명령, 실행하기 전에, 그것은 도움이 될 수있는 :
select replace(sql, ...) from SQLITE_MASTER where name = 'child' and type = 'table';
-
==============================
6.이 시도 할 수 있습니다 :
이 시도 할 수 있습니다 :
ALTER TABLE [Child] ADD COLUMN column_name INTEGER REFERENCES parent_table_name(column_id);
-
==============================
7.기본적으로 당신은 그러나 당신은 상황을 무시할 수 없습니다.
기본적으로 당신은 그러나 당신은 상황을 무시할 수 없습니다.
기존 테이블에 외래 키 제약 조건을 추가하는 올바른 방법은 다음과 같은 명령입니다.
db.execSQL("alter table child add column newCol integer REFERENCES parent(parent_Id)");
그런 다음 뉴콜에 PARENT_ID 데이터를 복사 한 다음 PARENT_ID 열을 삭제합니다. 따라서, 어떠한 임시 테이블에 대한 필요가 없습니다.
-
==============================
8.우선 아래의 코드 INT 다음 테이블 변경으로 자식 테이블 시드의 열을 추가합니다. 당신이 부모 테이블의 기본 키로 외부 키 시드를 추가하고 자식 테이블의 외래 키로 사용할 수 있습니다이 방법은 ... 그것은 나에게 좋은으로 당신을 도움이되기를 바랍니다 :
우선 아래의 코드 INT 다음 테이블 변경으로 자식 테이블 시드의 열을 추가합니다. 당신이 부모 테이블의 기본 키로 외부 키 시드를 추가하고 자식 테이블의 외래 키로 사용할 수 있습니다이 방법은 ... 그것은 나에게 좋은으로 당신을 도움이되기를 바랍니다 :
ALTER TABLE [child] ADD CONSTRAINT [CId] FOREIGN KEY ([CId]) REFERENCES [Parent]([CId]) ON DELETE CASCADE ON UPDATE NO ACTION; GO
from https://stackoverflow.com/questions/1884818/how-do-i-add-a-foreign-key-to-an-existing-sqlite-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버의 모든 데이터베이스의 모든 테이블에 대한 열 이름을 찾는 방법 (0) | 2020.04.29 |
---|---|
[SQL] PostgreSQL의에서 어떤 연산자 대 IN (0) | 2020.04.29 |
[SQL] 어떻게 SQL 서버 데이터베이스 테이블 컬럼에 이미지를 저장하기 위해 [중복] (0) | 2020.04.29 |
[SQL] 트리 구조의 최적화 된 SQL (0) | 2020.04.29 |
[SQL] 어떻게 SQL 데이터베이스에 할 수 있습니까 재주문 행 (0) | 2020.04.29 |