Ответ 1
Чтобы уточнить ответ от Zed и ответить на ваш комментарий:
INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;
См. T.J. Комментарий к Crowder
У меня есть две таблицы с одинаковой структурой, за исключением одного столбца... В таблице 2 есть дополнительный столбец, в который я бы вставлял CURRENT_DATE()
Я хотел бы скопировать все значения из таблицы1 в таблицу2.
если я использую
INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;
он выдает ошибку, указывающую на разницу в количестве столбцов.
У меня есть два вопроса:
Чтобы уточнить ответ от Zed и ответить на ваш комментарий:
INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;
См. T.J. Комментарий к Crowder
Самый безопасный способ сделать это - полностью указать столбцы как для вставки, так и для извлечения. Там нет гарантии (для приложения), что любой из них будет таким, каким вы считаете.
insert into dues_storage (f1, f2, f3, cd)
select f1, f2, f3, current_date() from dues where id = 5;
Если вы беспокоитесь о том, что вам нужно изменить несколько страниц PHP, которые это делают (как вы, кажется, указываете в комментарии к другому ответу), это созрело для хранимой процедуры. Таким образом, все ваши PHP-страницы просто вызывают хранимую процедуру с (например) только идентификатором для копирования и управляют фактическим процессом копирования. Таким образом, существует только одно место, где вам нужно поддерживать код, и, на мой взгляд, СУБД - это подходящее место для этого.
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
Надеюсь, это поможет кому-то... Вот немного PHP script Я написал, если вам нужно скопировать некоторые столбцы, но не другие, и/или столбцы не находятся в одном порядке в обеих таблицах. Пока столбцы называются одинаковыми, это будет работать. Поэтому, если таблица A имеет [userid, handle, something] и tableB имеет [userID, handle, timestamp], тогда вы бы "SELECT userID, handle, NOW() как временная метка FROM tableA", затем получите результат этого и передать результат в качестве первого параметра этой функции ($ z). $toTable - это строковое имя для таблицы, в которую вы копируете, и $link_identifier - это db, к которому вы копируете. Это относительно быстро для небольших наборов данных. Не рекомендуется, чтобы вы пытались перемещать более нескольких тысяч строк за раз таким образом в настройках производства. Я использую это прежде всего для резервного копирования данных, собранных во время сеанса, когда пользователь выходит из системы, а затем сразу же очищает данные из живого db, чтобы сохранить его тонким.
function mysql_multirow_copy($z,$toTable,$link_identifier) {
$fields = "";
for ($i=0;$i<mysql_num_fields($z);$i++) {
if ($i>0) {
$fields .= ",";
}
$fields .= mysql_field_name($z,$i);
}
$q = "INSERT INTO $toTable ($fields) VALUES";
$c = 0;
mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. !
while ($a = mysql_fetch_assoc($z)) {
foreach ($a as $key=>$as) {
$a[$key] = addslashes($as);
next ($a);
}
if ($c>0) {
$q .= ",";
}
$q .= "('".implode(array_values($a),"','")."')";
$c++;
}
$q .= ";";
$z = mysql_query($q,$link_identifier);
return ($q);
}
В качестве альтернативы вы можете использовать Внутренние запросы для этого.
SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);
Надеюсь, это поможет!
Просто хотел добавить этот маленький фрагмент, который прекрасно работает для меня.
INSERT INTO your_target_table ВЫБРАТЬ * FROM your_rescource_table WHERE id = 18;
И в то время как я нахожусь, он громко кричит Sequel Pro, если вы его не используете, я настоятельно рекомендую загрузить его... упрощает жизнь.
Я попробовал, что вы сказали, но я получаю сообщение, в котором говорится, что есть проблема с предложением where
вот что я пробовал:
INSERT INTO `seller` SELECT FROM `seller_test` WHERE
`s_code`=11;
Ошибка:
> #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
> near 'FROM `seller` WHERE `s_code`=11' at line 1
но когда я добавил * после ключевого слова SELECT и запрос стал примерно таким:
INSERT INTO `seller` SELECT ***** FROM `seller_test` WHERE
`s_code`=11;
Я получаю хороший результат поэтому попробуйте добавить * после ключевого слова SELECT