Buat tabel (struktur) dari tabel yang ada

101

Bagaimana cara membuat tabel baru yang strukturnya harus sama dengan tabel lainnya

Saya mencoba

CREATE TABLE dom AS SELECT * FROM dom1 WHERE 1=2

tapi terjadi kesalahan yang tidak berfungsi

Domnic
sumber
sangat membantu, menarik untuk memiliki klausa where yang selalu salah!
JosephDoggie

Jawaban:

168

Mencoba:

Select * Into <DestinationTableName> From <SourceTableName> Where 1 = 2

Perhatikan bahwa ini tidak akan menyalin indeks, kunci, dll.

Jika Anda ingin menyalin seluruhnya struktur, Anda perlu membuat Script Buat tabel. Anda dapat menggunakan skrip tersebut untuk membuat tabel baru dengan struktur yang sama. Anda juga dapat membuang data ke tabel baru jika perlu.

Jika Anda menggunakan Enterprise Manager, cukup klik kanan tabel dan pilih salin untuk membuat Buat Script.

Kevin Crowell
sumber
1
Kevin, hanya sedikit perubahan format pada jawaban Anda: - Pilih * Ke <DestinationTableName> Dari <SourceTableName> Di mana 1 = 2
Ashish Gupta
6
Qutbuddin, 1 = 2 akan mencegah penyalinan data dari tabel sumber ke tujuan. Coba sendiri: - CREATE TABLE Table1 (Id int, Name varchar (200)) INSERT INTO table1 VALUES (1, 'A') INSERT INTO table1 VALUES (2, 'B') - Will create table2 with data in table1 SELECT * KE Tabel2 DARI Tabel1 DIMANA 1 = 2 - Akan membuat tabel2 tanpa data di tabel1 PILIH * KE Tabel2 DARI Tabel1 DIMANA 1 = 2
Ashish Gupta
Saya pikir 1 = 2 akan menjadi argumen salah yang aneh untuk menghindari penyalinan data.
Arthur Zennig
45

Inilah yang saya gunakan untuk mengkloning struktur tabel (hanya kolom) ...

SELECT TOP 0 *
INTO NewTable
FROM TableStructureIWishToClone
DanielM
sumber
1
Solusi ini lebih jelas daripada memiliki kondisi ekstra "1 = 2", saya akan merekomendasikan ini
Pinte Dani
31

Salin struktur saja (salin semua kolom)

Select Top 0 * into NewTable from OldTable

Salin struktur saja (salin beberapa kolom)

Select Top 0 Col1,Col2,Col3,Col4,Col5 into NewTable from OldTable

Salin struktur dengan data

Select * into NewTable from OldTable

Jika Anda sudah memiliki tabel dengan struktur yang sama dan Anda hanya ingin menyalin data, gunakan ini

Insert into NewTable Select * from OldTable
Abhishek Maurya
sumber
Bekerja untuk saya di MSSQL 2008 R2
Pyrite
Solusi hebat, sederhana dan elegan. Apakah ada peretasan untuk membuat indeks salinan dan kunci utama ini juga?
Tumaini Mosha
16
Create table abc select * from def limit 0;

Ini pasti akan berhasil

GIRDHAR SINGH
sumber
Sempurna! Terima kasih
Dylan B
14

UNTUK MYSQL:

Kamu bisa memakai:

CREATE TABLE foo LIKE bar;

Dokumentasi di sini .

Francesco Gusmeroli
sumber
21
Pertanyaannya diberi tag sql-serveruntuk mana sintaks ini tidak valid, fyi.
Molomby
Seharusnya tidak dihitung sebagai jawaban karena hubungannya dengan MySQL bukan ke sql-server
celerno
2
FYI - ini juga mempertahankan kunci utama dan indeks.
garg10may
8

Mungkin juga perlu disebutkan bahwa Anda dapat melakukan hal berikut:

Klik kanan tabel yang ingin Anda duplikat > Script Tabel Sebagai > Buat Ke > Jendela Editor Kueri Baru

Kemudian, di mana dikatakan nama tabel yang baru saja Anda klik kanan di skrip yang telah dibuat, ubah namanya menjadi apa pun yang Anda inginkan agar tabel baru Anda dipanggil dan klik Execute

JsonStatham
sumber
5

coba ini .. di bawah ini salin seluruh struktur tabel yang ada tetapi bukan datanya.

create table AT_QUOTE_CART as select * from QUOTE_CART where 0=1 ;

jika Anda ingin menyalin data, gunakan yang di bawah ini:

create table AT_QUOTE_CART as select * from QUOTE_CART ;
Abhi Urs
sumber
5

Saya menggunakan proc yang disimpan berikut untuk menyalin skema tabel, termasuk PK, indeks, status partisi. Ini tidak terlalu cepat, tetapi tampaknya berhasil. Saya menyambut baik ide bagaimana mempercepatnya:

    /*
        Clones a table's schema from an existing table (without data)
        if target table exists, it will be dropped first.
        The following schema elements are cloned:
            * Structure
            * Primary key
            * Indexes
            * Constraints
    DOES NOT copy:
        * Triggers
        * File groups

    ASSUMPTION: constraints are uniquely named with the table name, so that we dont end up with duplicate constraint names
*/
CREATE PROCEDURE [dbo].[spCloneTableStructure]

@SourceTable            nvarchar(255),
@DestinationTable       nvarchar(255),
@PartionField           nvarchar(255),
@SourceSchema           nvarchar(255) = 'dbo',  
@DestinationSchema      nvarchar(255) = 'dbo',    
@RecreateIfExists       bit = 1

AS
BEGIN

DECLARE @msg  nvarchar(200), @PartionScript nvarchar(255), @sql NVARCHAR(MAX)

    IF EXISTS(Select s.name As SchemaName, t.name As TableName
                        From sys.tables t
                        Inner Join sys.schemas s On t.schema_id = s.schema_id
                        Inner Join sys.partitions p on p.object_id = t.object_id
                        Where p.index_id In (0, 1) and t.name = @SourceTable
                        Group By s.name, t.name
                        Having Count(*) > 1)

        SET @PartionScript = ' ON [PS_PartitionByCompanyId]([' + @PartionField + '])'
    else
        SET @PartionScript = ''

SET NOCOUNT ON;
BEGIN TRY   
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 1, Drop table if exists. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
     RAISERROR( @msg,0,1) WITH NOWAIT
    --drop the table
    if EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @DestinationTable)
    BEGIN
        if @RecreateIfExists = 1
            BEGIN
                exec('DROP TABLE [' + @DestinationSchema + '].[' + @DestinationTable + ']')
            END
        ELSE
            RETURN
    END

    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 2, Create table. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    --create the table
    exec('SELECT TOP (0) * INTO [' + @DestinationTable + '] FROM [' + @SourceTable + ']')       

    --create primary key
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 3, Create primary key. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    DECLARE @PKSchema nvarchar(255), @PKName nvarchar(255),@count   INT
    SELECT TOP 1 @PKSchema = CONSTRAINT_SCHEMA, @PKName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = @SourceSchema AND TABLE_NAME = @SourceTable AND CONSTRAINT_TYPE = 'PRIMARY KEY'
    IF NOT @PKSchema IS NULL AND NOT @PKName IS NULL
    BEGIN
        DECLARE @PKColumns nvarchar(MAX)
        SET @PKColumns = ''

        SELECT @PKColumns = @PKColumns + '[' + COLUMN_NAME + '],'
            FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
            where TABLE_NAME = @SourceTable and TABLE_SCHEMA = @SourceSchema AND CONSTRAINT_SCHEMA = @PKSchema AND CONSTRAINT_NAME= @PKName
            ORDER BY ORDINAL_POSITION

        SET @PKColumns = LEFT(@PKColumns, LEN(@PKColumns) - 1)

        exec('ALTER TABLE [' + @DestinationSchema + '].[' + @DestinationTable + '] ADD  CONSTRAINT [PK_' + @DestinationTable + '] PRIMARY KEY CLUSTERED (' + @PKColumns + ')' + @PartionScript);
    END

    --create other indexes
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 4, Create Indexes. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    DECLARE @IndexId int, @IndexName nvarchar(255), @IsUnique bit, @IsUniqueConstraint bit, @FilterDefinition nvarchar(max), @type int

    set @count=0
    DECLARE indexcursor CURSOR FOR
    SELECT index_id, name, is_unique, is_unique_constraint, filter_definition, type FROM sys.indexes WHERE is_primary_key = 0 and object_id = object_id('[' + @SourceSchema + '].[' + @SourceTable + ']')
    OPEN indexcursor;
    FETCH NEXT FROM indexcursor INTO @IndexId, @IndexName, @IsUnique, @IsUniqueConstraint, @FilterDefinition, @type
    WHILE @@FETCH_STATUS = 0
       BEGIN
            set @count =@count +1
            DECLARE @Unique nvarchar(255)
            SET @Unique = CASE WHEN @IsUnique = 1 THEN ' UNIQUE ' ELSE '' END

            DECLARE @KeyColumns nvarchar(max), @IncludedColumns nvarchar(max)
            SET @KeyColumns = ''
            SET @IncludedColumns = ''

            select @KeyColumns = @KeyColumns + '[' + c.name + '] ' + CASE WHEN is_descending_key = 1 THEN 'DESC' ELSE 'ASC' END + ',' from sys.index_columns ic
            inner join sys.columns c ON c.object_id = ic.object_id and c.column_id = ic.column_id
            where index_id = @IndexId and ic.object_id = object_id('[' + @SourceSchema + '].[' + @SourceTable + ']') and key_ordinal > 0
            order by index_column_id

            select @IncludedColumns = @IncludedColumns + '[' + c.name + '],' from sys.index_columns ic
            inner join sys.columns c ON c.object_id = ic.object_id and c.column_id = ic.column_id
            where index_id = @IndexId and ic.object_id = object_id('[' + @SourceSchema + '].[' + @SourceTable + ']') and key_ordinal = 0
            order by index_column_id

            IF LEN(@KeyColumns) > 0
                SET @KeyColumns = LEFT(@KeyColumns, LEN(@KeyColumns) - 1)

            IF LEN(@IncludedColumns) > 0
            BEGIN
                SET @IncludedColumns = ' INCLUDE (' + LEFT(@IncludedColumns, LEN(@IncludedColumns) - 1) + ')'
            END

            IF @FilterDefinition IS NULL
                SET @FilterDefinition = ''
            ELSE
                SET @FilterDefinition = 'WHERE ' + @FilterDefinition + ' '

            SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 4.' + CONVERT(NVARCHAR(5),@count) + ', Create Index ' + @IndexName + '. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
            RAISERROR( @msg,0,1) WITH NOWAIT

            if @type = 2
                SET @sql = 'CREATE ' + @Unique + ' NONCLUSTERED INDEX [' + @IndexName + '] ON [' + @DestinationSchema + '].[' + @DestinationTable + '] (' + @KeyColumns + ')' + @IncludedColumns + @FilterDefinition  + @PartionScript
            ELSE
                BEGIN
                    SET @sql = 'CREATE ' + @Unique + ' CLUSTERED INDEX [' + @IndexName + '] ON [' + @DestinationSchema + '].[' + @DestinationTable + '] (' + @KeyColumns + ')' + @IncludedColumns + @FilterDefinition + @PartionScript
                END
            EXEC (@sql)
            FETCH NEXT FROM indexcursor INTO @IndexId, @IndexName, @IsUnique, @IsUniqueConstraint, @FilterDefinition, @type
       END
    CLOSE indexcursor
    DEALLOCATE indexcursor

    --create constraints
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 5, Create constraints. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    DECLARE @ConstraintName nvarchar(max), @CheckClause nvarchar(max), @ColumnName NVARCHAR(255)
    DECLARE const_cursor CURSOR FOR
        SELECT
            REPLACE(dc.name, @SourceTable, @DestinationTable),[definition], c.name
        FROM sys.default_constraints dc
            INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
        WHERE OBJECT_NAME(parent_object_id) =@SourceTable               
    OPEN const_cursor
    FETCH NEXT FROM const_cursor INTO @ConstraintName, @CheckClause, @ColumnName
    WHILE @@FETCH_STATUS = 0
       BEGIN
            exec('ALTER TABLE [' + @DestinationTable + '] ADD CONSTRAINT [' + @ConstraintName + '] DEFAULT ' + @CheckClause + ' FOR ' + @ColumnName)
            FETCH NEXT FROM const_cursor INTO @ConstraintName, @CheckClause, @ColumnName
       END;
    CLOSE const_cursor
    DEALLOCATE const_cursor                 


END TRY
    BEGIN CATCH
        IF (SELECT CURSOR_STATUS('global','indexcursor')) >= -1
        BEGIN
         DEALLOCATE indexcursor
        END

        IF (SELECT CURSOR_STATUS('global','const_cursor')) >= -1
        BEGIN
         DEALLOCATE const_cursor
        END


        PRINT 'Error Message: ' + ERROR_MESSAGE(); 
    END CATCH

END

GO
Steve Faiwiszewski
sumber
1
Membuat ini lebih cepat mungkin semudah mendeklarasikan kursor Anda CURSOR LOCAL FAST_FORWARD. Secara pribadi saya mencoba membuat skrip serupa tanpa menggunakan kursor dan melihat bagaimana kinerjanya.
mendosi
Hai @mendosi Saya tahu ini sudah tua, tapi saat ini saya sedang mencari pembuatan skrip CREATE dengan semua hal-hal lain (kendala / indeks / partisi / pemicu / dll) bersama dengan definisi kolom. Saya ingin tahu apakah Anda berhasil membuat ulang ini dengan pendekatan non-kursor. jika demikian, maukah Anda membagikannya? Sangat dihargai, terima kasih
007
Skrip yang saya tulis menyalin satu atau beberapa tabel dan tidak menggunakan kursor. Itu juga terlalu besar untuk dikomentari. Sebagai gantinya saya akan menautkan ke skrip Hans Michiels: hansmichiels.com/2016/02/18/…
mendosi
4
  1. Jika Anda Ingin menyalin DatabaseBase yang Sama

    Select * INTO NewTableName from OldTableName
  2. Jika DatabaseBase Lain

    Select * INTO NewTableName from DatabaseName.OldTableName
cd pandey
sumber
3
SELECT * 
INTO NewTable
FROM OldTable
WHERE 1 = 2
Chris Latta
sumber
3

Saya tidak tahu mengapa Anda ingin melakukan itu, tetapi coba:

SELECT *
INTO NewTable
FROM OldTable
WHERE 1 = 2

Ini harus berhasil.

Adrian Fâciu
sumber
Saya pikir itu juga akan menyalin data? dia hanya menginginkan strukturnya.
Ashish Gupta
@Ashis Gupta - Terima kasih, saya lupa "di mana" :)
Adrian Fâciu
3
Copy the table structure:-
select * into newtable from oldtable where 1=2;

Copy the table structure along with table data:-
select * into newtable from oldtable where 1=1;
NameNotFoundException
sumber
3
ini tidak menyalin kendala dan kunci
Trikaldarshi
2

Ditemukan di sini apa yang saya cari. Membantu saya mengingat apa yang saya gunakan 3-4 tahun yang lalu.

Saya ingin menggunakan kembali sintaks yang sama untuk dapat membuat tabel dengan data yang dihasilkan dari gabungan tabel.

Muncul dengan kueri di bawah ini setelah beberapa upaya.

SELECT a.*
INTO   DetailsArchive
FROM   (SELECT d.*
        FROM   details AS d
               INNER JOIN
               port AS p
               ON p.importid = d.importid
        WHERE  p.status = 2) AS a;
user_v
sumber
0
SELECT * INTO newtable
from Oldtable
BalaRam
sumber
Silakan gunakan markup kode untuk keterbacaan yang lebih baik, juga itu lebih berguna untuk menjelaskan sedikit tentang kode Anda.
Nima Derakhshanjan
Terima kasih atas cuplikan kode ini, yang mungkin memberikan beberapa bantuan langsung. Penjelasan yang tepat akan sangat meningkatkan nilai pendidikannya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah tersebut, dan akan membuatnya lebih berguna bagi pembaca yang akan datang dengan pertanyaan serupa, tetapi tidak identik. Secara khusus, ini terlihat oleh mata yang tidak terlatih seolah-olah ini juga akan menyalin konten Oldtable. Bagaimana itu dihindari?
Toby Speight
-1

Jika Anda ingin membuat tabel dengan satu-satunya struktur yang akan disalin dari tabel asli maka Anda dapat menggunakan perintah berikut untuk melakukannya.

create table <tablename> as select * from <sourcetablename> where 1>2;

Dengan kondisi palsu ini, Anda dapat meninggalkan catatan dan menyalin struktur.

Sai Durga Kamesh Kota
sumber
Ini adalah duplikat dari jawaban yang sudah ada. Baca jawaban yang ada sebelum mengirimkan yang baru, dan tambahkan komentar / suara jika sesuai.
Kevin Hogg
Tetapi tidak sama dengan jawaban yang ada di sini saya menggunakan perintah buat untuk melakukan tindakan ini
Sai Durga Kamesh Kota
Jika Anda meninjau jawaban @Abhirs (02-Jan-2015), jawaban Anda mirip dengan bagian pertama dari jawaban mereka, meskipun dengan klausa where yang sedikit berbeda. Bagian pertama => create table AT_QUOTE_CART as select * from QUOTE_CART where 0=1 ; Ganti nama tab tersebut dan kita mendapatkan: create table <tablename> as select * from <sourcetablename> where 0=1 ; Adapun klausa where, 0=1mencapai hasil yang sama seperti 1>2tidak ada data yang diambil.
Kevin Hogg