복붙노트

[SQL] 어떻게 기존 SQLite는 테이블에 외래 키를 추가하는 방법은 무엇입니까?

SQL

어떻게 기존 SQLite는 테이블에 외래 키를 추가하는 방법은 무엇입니까?

나는 다음과 같은 테이블이 있습니다 :

CREATE TABLE child( 
  id INTEGER PRIMARY KEY, 
  parent_id INTEGER, 
  description TEXT);

어떻게 PARENT_ID에 외래 키 제약 조건을 추가하는 방법은 무엇입니까? 가정 외래 키가 활성화됩니다.

대부분의 예는 테이블을 만드는 가정 - 내가 기존에 제약 조건을 추가하고 싶습니다.

해결법

  1. ==============================

    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. ==============================

    2.당신은 당신이 테이블을 변경할 경우 제약 조건을 추가하고 제약 조건을 사용하는 열을 추가 할 수 있습니다.

    당신은 당신이 테이블을 변경할 경우 제약 조건을 추가하고 제약 조건을 사용하는 열을 추가 할 수 있습니다.

    첫째, PARENT_ID없이 테이블을 만들 :

    CREATE TABLE child( 
      id INTEGER PRIMARY KEY,  
      description TEXT);
    

    그런 다음, 테이블 변경 :

    ALTER TABLE child ADD COLUMN parent_id INTEGER REFERENCES parent(id);
    
  3. ==============================

    3.https://www.sqlite.org/lang_altertable.html#otheralter을 확인하시기 바랍니다

    https://www.sqlite.org/lang_altertable.html#otheralter을 확인하시기 바랍니다

  4. ==============================

    4.당신이 파이어 폭스 애드온 sqlite가 매니저를 사용하는 경우 다음을 수행 할 수 있습니다 :

    당신이 파이어 폭스 애드온 sqlite가 매니저를 사용하는 경우 다음을 수행 할 수 있습니다 :

    대신 삭제하고 다시 테이블을 만드는 하나는 다음과 같이 수정할 수 있습니다.

    열 텍스트 상자에서 마우스 오른쪽 컨텍스트 메뉴를 불러와 편집 열을 선택 나열된 마지막 열 이름을 클릭합니다. 테이블 정의의 마지막 열이 PRIMARY KEY 인 경우 먼저 새 열을 추가 한 다음 FOREIGN KEY 정의를 추가하기 위해 새로운 열의 열 유형을 편집 할 필요가 않습니다. 열 유형 상자 내에서 쉼표과를 추가

    FOREIGN KEY (parent_id) REFERENCES parent(id)
    

    데이터 유형 후 정의. 변경 버튼을 클릭 한 후 위험 작업 대화 상자에서 예 버튼을 클릭합니다.

    참고: SQLite는 관리자

  5. ==============================

    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. ==============================

    6.이 시도 할 수 있습니다 :

    이 시도 할 수 있습니다 :

    ALTER TABLE [Child] ADD COLUMN column_name INTEGER REFERENCES parent_table_name(column_id);
    
  7. ==============================

    7.기본적으로 당신은 그러나 당신은 상황을 무시할 수 없습니다.

    기본적으로 당신은 그러나 당신은 상황을 무시할 수 없습니다.

    기존 테이블에 외래 키 제약 조건을 추가하는 올바른 방법은 다음과 같은 명령입니다.

    db.execSQL("alter table child add column newCol integer REFERENCES parent(parent_Id)");
    

    그런 다음 뉴콜에 PARENT_ID 데이터를 복사 한 다음 PARENT_ID 열을 삭제합니다. 따라서, 어떠한 임시 테이블에 대한 필요가 없습니다.

  8. ==============================

    8.우선 아래의 코드 INT 다음 테이블 변경으로 자식 테이블 시드의 열을 추가합니다. 당신이 부모 테이블의 기본 키로 외부 키 시드를 추가하고 자식 테이블의 외래 키로 사용할 수 있습니다이 방법은 ... 그것은 나에게 좋은으로 당신을 도움이되기를 바랍니다 :

    우선 아래의 코드 INT 다음 테이블 변경으로 자식 테이블 시드의 열을 추가합니다. 당신이 부모 테이블의 기본 키로 외부 키 시드를 추가하고 자식 테이블의 외래 키로 사용할 수 있습니다이 방법은 ... 그것은 나에게 좋은으로 당신을 도움이되기를 바랍니다 :

    ALTER TABLE [child] 
      ADD CONSTRAINT [CId] 
      FOREIGN KEY ([CId]) 
      REFERENCES [Parent]([CId]) 
      ON DELETE CASCADE ON UPDATE NO ACTION;
    GO
    
  9. 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