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

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
Andomar
источник
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;

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

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

RCNeil
источник
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;
Али Азаз Алам
источник