복붙노트

[SQL] sqlite3를 새로운 테이블로 복사 테이블 구조

SQL

sqlite3를 새로운 테이블로 복사 테이블 구조

새 기존 테이블 구조를 복사 할 수있는 쉬운 방법이 있나요? (망가 필요한 데이터 만 구조 - 아이디 INTEGER, 이름 varchar (20)과 같은> ...)

고마워

해결법

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

    1.이 같은 명령을 사용할 수 있습니다 :

    이 같은 명령을 사용할 수 있습니다 :

    CREATE TABLE copied AS SELECT * FROM mytable WHERE 0
    

    하지만 SQLite는의 동적 타이핑으로 인해 대부분의 유형 정보가 손실 될 것이다.

    원래 같은 동작합니다, 즉, 동일한 수의 열이와 이름을 가지고 있으며, 같은 값을 저장할 수있는 단지 테이블을해야하는 경우,이 충분하다.

    당신이 정말로 정확하게 원래 같은 유형의 정보가 필요한 경우, 원래 SQL이처럼있는 sqlite_master 테이블에서 CREATE TABLE 문을 읽을 수 있습니다 :

    SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable'
    
  2. ==============================

    2.PK, 기본값 및 인덱스와 SQLite는 할 수 없습니다 복제 테이블.

    PK, 기본값 및 인덱스와 SQLite는 할 수 없습니다 복제 테이블.

    다른 도구에 의해 해킹이 필요하다.

    쉘에서 나오지하여 테이블 이름을 바꿉니다.

    sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile
    

    그리고 당신은 새로운 테이블을 확인할 수 있습니다.

    sqlite3 dbfile '.schema newtable'
    

    기본 키, 기본값 및 인덱스는 예약됩니다.

    나는이 명령은 당신을 도울 수 있기를 바랍니다.

  3. ==============================

    3.sqlite가> .schema

    sqlite가> .schema

    CREATE TABLE [About](
      [id],
      [name],
      [value]);
    

    .schema 명령은 당신에게이 명령에 SQLite는 손으로 통역, 타이핑을 프로그래밍하여 만들 수있는 정보 테이블 방식의 구조를 제공 할 것입니다.

    (가) 테이블에 새 이름을 부여 블록을 생성, 붙여 넣기 및 실행 :

    sqlite> CREATE TABLE [AboutToo](
      [id],
      [name],
      [value]);
    

    .tables는 과거와 현재, "복사"두 테이블을 가지고 보여줍니다 지금 명령.

    sqlite> .tables
    About     AboutToo
    

    추신. sqlite가>는 SQLite.exe 인터프리터를 실행 한 후 콘솔에서 얻을 프롬프트 명령입니다. 이 www.sqlite.org로 이동 얻으려면

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

    4.그냥 기록을 위해 - 이것은 나를 위해 일한 :

    그냥 기록을 위해 - 이것은 나를 위해 일한 :

    CREATE TABLE mytable (
        contact_id INTEGER PRIMARY KEY,
        first_name TEXT NOT NULL,
        last_name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE,
        phone TEXT NOT NULL UNIQUE
    );
    
    -- Two variations
    INSERT INTO mytable VALUES ( 1, "Donald", "Duck", "noone@nowhere.com", "1234");
    INSERT INTO mytable ( contact_id,first_name,last_name,email,phone ) VALUES ( 2, "Daisy", "Duck", "daisy@nowhere.com", "45678");
    
    .output copied.sql
    -- Add new table name
    .print CREATE TABLE copied ( 
    -- Comment out first line from SQL
    SELECT "-- " || sql FROM sqlite_master WHERE type='table';
    .output 
    .read copied.sql
    .schema
    select * from copied;
    

    스키마 (mytable 테이블을 만든 후 포장되어있을 경우에만 작동하는지 조심하십시오. 그렇지 않으면 .system 사용하여 일부 문자열을 교체해야합니다

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

    5.내가 선호하는 :

    내가 선호하는 :

    > sqlite3 <db_file>
    
    sqlite3 > .output <output_file>
    sqlite3 > .dump <table_name>
    

    선은 위의 DDL 및 DML 문이 포함되어 테이블의 덤프를 생성합니다.

    메이크업 즉 찾아 새 테이블 이름과 테이블 이름을 대체,이 파일에 변경

    또한, 교체와 함께 "트리거 만들기"이 그것에 새 테이블 이름으로 트리거 이름으로 기존의 트리거를 대체 할 것이다 "TRIGGER _ 만들기". 즉, 고유하게되며, 기존의 트리거와 충돌을 발생하지 않습니다. 모든 스키마 변경이 구현되면, 그것은 .read를 사용하여 데이터베이스에 다시 읽어

    sqlite3 > .read output_file
    

    이는 같은 쉘 명령을 사용하여 쉘 파일에 스크립팅 할 수 있습니다 :

    echo ".dump <table>" | sqlite3 <db_file> > <table_file>
    sed -i.bak "s/\b<table_name>\b/<new_table_name>/g" <table_file>
    sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER <new_table_name_>/g" <table_file>
    echo ".read <table_file>" | sqlite3 <db_file>
    rm <table_name>.bak 
    

    예를 들면 :

    당신은 테이블 T를 가지고 새로운 테이블을 생성하는 파일 F와 DB 파일 D에 TClone 인 경우 : 다음

    echo ".dump T" | sqlite3 D.sqlite > F
    sed -i.bak "s/\bT\b/TClone/g" F
    sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER TClone_>/g" F
    echo ".read F" | sqlite3 D.sqlite 
    rm T.bak
    

    마지막으로, 당신은 당신이 어떤 테이블을 복제하는 데 사용할 수있는 매개 변수로 SOURCE_TABLE, destination_table, db_file을 전달할 수있는 매개 변수화 된 버전을 만들어이 스크립트를 일반화 할 수 있습니다.

    나는 이것을 테스트하고 그것을 작동합니다.

    테스트 :

    sqlite3 <database_file>
    sqlite3 > select * from <new_table>;
    

    당신에게 원래 테이블과 동일한 결과를 제공한다. 과

    sqlite3 > .schema <new_table>
    

    새 이름으로 원래 테이블과 동일한 스키마를 가져야한다.

  6. from https://stackoverflow.com/questions/12730390/copy-table-structure-to-new-table-in-sqlite3 by cc-by-sa and MIT license