Копирование строк в MySQL

Я хочу скопировать все столбцы строки, но не обязательно указывать каждый столбец. Я знаю синтаксис http://dev.mysql.com/doc/refman/5.1/en/insert-select.html, но я не вижу возможности игнорировать столбец.

В моем примере я пытаюсь скопировать все столбцы строки в новую строку, за исключением первичного ключа.

Есть ли способ сделать это без необходимости писать запрос с каждым полем в нем?

Ответ 1

Если ваш столбец id или первичный ключ auto_increment, вы можете использовать таблицу temp:

CREATE TEMPORARY TABLE temp_table 
AS 
SELECT * FROM source_table WHERE id='7'; 
UPDATE temp_table SET id='100' WHERE id='7';
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;

таким образом, вы можете скопировать все данные в строке id = '7', а затем назначить новое значение "100" (или любое другое значение падает выше диапазона вашего текущего значения auto_increment в source_table).

Изменить: Mind the; после утверждений:)

Ответ 2

Вам нужно будет указать столбцы, которые вы хотите выбрать, если вы не выбираете их все. Копировать/Вставить - ваш друг.

Ответ 3

Это PHP script, который я написал для этого, он предположит, что ваш первый col является вашим автоматическим приращением.

$sql = "SELECT * FROM table_name LIMIT 1"; 
$res = mysql_query($sql) or die(mysql_error());
for ($i = 1; $i < mysql_num_fields($res); $i++) {
     $col_names .= mysql_field_name($res, $i).", ";
 }
 $col_names = substr($col_names, 0, -2);

$sql = "INSERT INTO table_name (".$col_names.") SELECT ".$col_names." FROM table_name WHERE condition ";
$res = mysql_query($sql) or die(mysql_error());

Ответ 4

Если вы не укажете столбцы, вы должны сохранить записи в порядке. Например:

INSERT INTO `users` (`ID`, `Email`, `UserName`) VALUES
(1, '[email protected]', 'StackOverflow')

Будет работать, но

INSERT INTO `users` VALUES
('[email protected]', 'StackOverflow')

разместил бы адрес электронной почты в столбце ID, чтобы он не помог.

Попробуйте написать столбцы один раз:

INSERT INTO `users` (`Email`, `UserName`) VALUES
('[email protected]', 'StackOverflow'),
('[email protected]', 'StackOverflow2'),
('[email protected]', 'StackOverflow3'),
etc...

Я думаю, что существует ограничение на количество строк, которые вы можете вставить с помощью этого метода.

Ответ 5

Нет, это невозможно.

Но легко получить список столбцов и просто удалить тот, который вы не хотите копировать, этот процесс также можно выполнить с помощью кода и т.д.

Ответ 6

Скопируйте таблицу в новую, а затем удалите нужный столбец. Просто.

Ответ 7

Я предполагаю, что, поскольку вы хотите опустить первичный ключ, который является столбцом auto_increment, и вы хотите, чтобы MySQL автоматически генерировал следующее значение в последовательности.

Учитывая, что, если вам не нужно делать массовые вставки через вставку в... select from method, следующее будет работать для одиночных/многозадачных записей:

Вставить в mytable (null, 'a', 'b', 'c');

Где первый столбец - ваш первичный ключ auto_incremented, а остальные - ваши другие столбцы в таблице. Когда MySQL видит нуль (или 0) для столбца auto_incremented, он автоматически заменит значение null на следующее допустимое значение (см. эта ссылка Чтобы получить больше информации). Эту функциональность можно отключить, отключив режим NO_AUTO_VALUE_ON_ZERO sql, описанный в этой ссылке.

Сообщите мне, если у вас есть какие-либо вопросы.

-Dipin