[SQL] sqlite3를 새로운 테이블로 복사 테이블 구조
SQLsqlite3를 새로운 테이블로 복사 테이블 구조
새 기존 테이블 구조를 복사 할 수있는 쉬운 방법이 있나요? (망가 필요한 데이터 만 구조 - 아이디 INTEGER, 이름 varchar (20)과 같은> ...)
고마워
해결법
-
==============================
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.PK, 기본값 및 인덱스와 SQLite는 할 수 없습니다 복제 테이블.
PK, 기본값 및 인덱스와 SQLite는 할 수 없습니다 복제 테이블.
다른 도구에 의해 해킹이 필요하다.
쉘에서 나오지하여 테이블 이름을 바꿉니다.
sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile
그리고 당신은 새로운 테이블을 확인할 수 있습니다.
sqlite3 dbfile '.schema newtable'
기본 키, 기본값 및 인덱스는 예약됩니다.
나는이 명령은 당신을 도울 수 있기를 바랍니다.
-
==============================
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.그냥 기록을 위해 - 이것은 나를 위해 일한 :
그냥 기록을 위해 - 이것은 나를 위해 일한 :
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.내가 선호하는 :
내가 선호하는 :
> 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>
새 이름으로 원래 테이블과 동일한 스키마를 가져야한다.
from https://stackoverflow.com/questions/12730390/copy-table-structure-to-new-table-in-sqlite3 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 개의 SQL 쿼리를 가입 (0) | 2020.07.23 |
---|---|
[SQL] 항목의 모든 조상을 얻는다 SQL 재귀 쿼리 (0) | 2020.07.23 |
[SQL] 부울 필드 색인 (0) | 2020.07.23 |
[SQL] 간단한 날짜 시간 SQL 쿼리 (0) | 2020.07.23 |
[SQL] PostgreSQL의 두 날짜 사이의 결과를 얻기 (0) | 2020.07.23 |