Копировать таблицу без копирования данных


153
CREATE TABLE foo SELECT * FROM bar

копирует таблицу fooи дублирует ее как новую таблицу с именем bar.

Как я могу скопировать схему fooв новую таблицу, которая также называется bar без копирования данных?


1
как сделать то же самое в sqlserver 2005?
Гром

что значит из бара?
Смит Сарая


@ Thunder выглядит так, как будто вы можете сделать копию «только Colums» в MS SQL. См. Это для справки: stackoverflow.com/questions/2505728/…
Кевин Уортингтон

Ответы:


140

Пытаться:

CREATE TABLE foo SELECT * FROM bar LIMIT 0

Или:

CREATE TABLE foo SELECT * FROM bar WHERE 1=0

4
@ Thunder: попробуйтеselect * into foo from bar where 1=0
Andomar

29
Кажется, это не копирует ограничения или ключи
Тимо Хуовинен,

15
@TimoHuovinen: Возможно create table NewTable like OldTable, это вариант для вас. Ссылка скопирована с удаленного ответа.
Andomar

2
Будьте очень осторожны при использовании этого под нагрузкой и с высоким параллелизмом. Я только что использовал это в масштабе, где мы создали около 50 различных таблиц на основе одной и той же исходной таблицы, в то же время вставляя в исходную таблицу другие процессы. В основном это вызвало массовое разрушение блокировки и пришлось перезапустить MySQL.
Марк Б

6
Хм, ОП смущен? Это явно неправильный ответ на вопрос, если мы обратим внимание на заголовок и акцент в вопросе «... без копирования данных ...». Ответ RCNell по праву получил наибольшее количество голосов. Не уверен, почему этот был принят. Просто говорю'.
xyphenor

423

Пытаться

CREATE TABLE foo LIKE bar;

поэтому ключи и индексы копируются так же хорошо.

Документация


40
Это лучший ответ, поскольку он также копирует индексы!
Чайтан

2
Это намного лучше, но все еще не копирует внешние ключи.
Йозеф Сабл

@RCNeil, CREATE TABLE new_tbl LIKE orig_tbl;копирует ли права тоже? Или они должны быть скопированы вручную?
Pacerier

2
Вероятно, потому что этот ответ пришел на 4 года позже, чем тот, который помечен как правильный
pythonian29033

1
@ Pierre-OlivierVares Текст документации не имеет непосредственного отношения к фактическому ответу. Текст ответа лаконичен и показывает, как выполнить заданный вопрос, а ссылка на документацию просто предоставляет дополнительный контекст. Таким образом, раздутый ответ с текстом из документации не является полезным.
Abion47

27
SHOW CREATE TABLE bar;

вы получите инструкцию create для этой таблицы, отредактируете имя таблицы или что-то еще, что вам нравится, и затем выполните его.

Это позволит вам скопировать индексы, а также вручную настроить создание таблицы.

Вы также можете запустить запрос в программе.


Как вы могли бы преобразовать show create table barв динамически исполняемый оператор?
Pacerier

полученный в результате результат show create table barуже выполним, если у скрипта есть разрешение на создание таблиц, вы можете проанализировать его и затем выполнить операторы alter table.
Тимо Хуовинен

create table...не будет копировать индексы. этот ответ - лучший вариант
bluepinto

2

Хочется только клонировать структуру таблицы:

CREATE TABLE foo SELECT * FROM bar WHERE 1 = 2;

Также хочет скопировать данные:

CREATE TABLE foo as SELECT * FROM bar;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.