У меня есть две разные базы данных, имена:
Я хочу выбрать все данные и новые записи от dbtest Table 1 до dbtest2 Table 2.
Я пробовал это
$sqlfin = "INSERT INTO dbtest2.Table2 SELECT * FROM dbtest.Table1";
$resultfi = mysqli_query($db_conn, $sqlfin);
Но пока не повезло. Как я могу гарантировать, что новые записи будут вставлены в обе таблицы? Любая помощь будет оценена?
давайте попробуем это в этом формате
INSERT INTO `dbtest2`.`Table2` SELECT * FROM `dbtest`.`Table1`
Для операторов INSERT … SELECT выполняются следующие условия:
- Укажите IGNORE, чтобы игнорировать строки, которые могут привести к нарушениям дубликата ключа.
- Столбцы AUTO_INCREMENT работают как обычно.
- Чтобы гарантировать возможность использования двоичного журнала для повторного создания исходных таблиц, MySQL не разрешает одновременные вставки для INSERT … SELECT
заявления (см. Раздел 8.11.3, «Параллельные вставки»).- Чтобы избежать неоднозначных проблем со ссылками на столбцы, когда SELECT и INSERT ссылаются на одну и ту же таблицу, предоставьте уникальный псевдоним для каждого
таблица, используемая в части SELECT, и квалифицировать имена столбцов в этом
расстаться с соответствующим псевдонимом.
Создать триггер: для добавления новых записей
CREATE TRIGGER copy_record BEFORE INSERT ON dbtest.Table1
FOR EACH ROW
BEGIN
INSERT INTO dbtest2.Table2 (first_name, last_name) VALUES (new.first_name, new.last_name);
END
trigger_event указывает тип операции, которая активирует
спусковой крючок. Эти значения trigger_event разрешены:INSERT: The trigger activates whenever a new row is inserted into the table; for example, through INSERT, LOAD DATA, and REPLACE
заявления.
UPDATE: The trigger activates whenever a row is modified; for example, through UPDATE statements. DELETE: The trigger activates whenever a row is deleted from the table; for example, through DELETE and REPLACE statements. DROP TABLE
и операторы TRUNCATE TABLE в таблице не активируют это
триггер, потому что они не используют DELETE. Удаление раздела не
активируйте триггеры DELETE, либо.
Попробуйте этот запрос для желаемой задачи:
Сначала запрос (Создать таблицу точно так же, как в старой базе данных, если у вас нет):
CREATE TABLE dbtest2.Table2 LIKE dbtest.Table1;
Второй запрос (Вставьте все данные во вновь созданную таблицу) :
INSERT INTO dbtest2.Table2 SELECT * FROM dbtest.Table1;
Ваш запрос выглядит правильно, но не удастся, если две таблицы имеют разную структуру. Укажите столбцы, чтобы избежать этого, например:
INSERT INTO dbtest2.Table2 (2_col_1, 2_col_2) SELECT 1_col_1, 1_col_2 FROM dbtest.Table1
С PDO (своего рода альтернативный ответ, я не знаю много для Mysqli):
Вы можете подключиться к Mysql с PDO без указания имени базы данных при работе с несколькими (но это не обязательно), лайк:
$db = new PDO( "mysql:host=" . $host . ";", $user, $password, $options );
Затем напишите имена базы данных, таблицы и столбцы, как при создании JOIN
(как вы сделали): разделены .
// an example ..
$useDb = $db->query("INSERT INTO db_1.table1 (value_1, value_2) SELECT value_3, value_4 FROM db_2.table2 WHERE db_2.table2.id = 5");
(пример проверен и работает нормально)
INSERT INTO dbtest2 (
id,
name,
status )
SELECT id,
name,
'1'
FROM dbtest
ORDER BY id ASC
Вы можете использовать INSERT … SELECT синтаксис. Обратите внимание, что вы можете указать ‘1’ непосредственно в части SELECT.