Копирование строк в MySQL - PullRequest
14 голосов
/ 23 октября 2008

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

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

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

Ответы [ 7 ]

16 голосов
/ 13 октября 2010

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

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; после отчетов:)

3 голосов
/ 23 октября 2008

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

2 голосов
/ 10 июня 2011

Это PHP-скрипт, который я написал для этого, он будет предполагать, что вашим первым столбцом является ваше автоинкремент.

$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());
1 голос
/ 13 декабря 2011

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

1 голос
/ 23 октября 2008

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

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

1 голос
/ 23 октября 2008

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

INSERT INTO `users` (`ID`, `Email`, `UserName`) VALUES
(1, 'so@so.com', 'StackOverflow')

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

INSERT INTO `users` VALUES
('so@so.com', 'StackOverflow')

поместит Email в столбец идентификатора, так что это бесполезно.

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

INSERT INTO `users` (`Email`, `UserName`) VALUES
('so@so.com', 'StackOverflow'),
('so2@so.com', 'StackOverflow2'),
('so3@so.com', 'StackOverflow3'),
etc...

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

0 голосов
/ 21 марта 2009

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

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

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

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

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

-Dipin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...