Копирование строк в 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