Задавайте вопросы, мы ответим
Вы не зашли.
Имеем 2 сервера А, В
Таблицы: А.table1 (id,...); A.table2 (id, t1_id,...)
ночью это дело импортируется в одну таблицу на сервере В (как бы сливается, см. ниже)
B.table1 (id,...)
// id - везде PRIMARY + AUTOINCREMENT
следующим образом:
A.table1 -> B.table1 без изменений
A.table2 -> B.table1 по след схеме:
если A.table2.t1_id <> 0, INSERT B.table1(t1_id, ...)
если A.table2.t1_id = 0, то выполняем
START TRANSACTION;
INSERT INTO A.table1(); // новая запись для получения ID через Autoincrement
SELECT LAST_INSERT_ID(); // то самое ID
UPDATE A.table2 SET t1_id = {то самое ID} WHERE {текущая запись};
DELETE FROM A.table1 WHERE id = {то самое ID};
COMMIT;
INSERT B.table1({то самое ID}, ...)
Т.о. в A.table2.t1_id записывается ID эскпортированного елемента.
Обнаружил, что в A.table2.t1_id накопились дублирующиеся ID.
Вопрос: Гарантирует ли выше описанная схема уникальность объектов при сливании A.table1 & A.table2?
Отредактированно vaspet (04.01.2012 16:43:59)
Неактивен
Совсем простой вопрос.
Autoincrement гарантирует уникальность?
С таблицей происходит работа: вставление / удаление записей.
Неактивен
Автоинкремент гарантирует уникальность, но только в пределах одной таблицы.
В Вашем случае, кажется, всё должно работать правильно (при условии, что это
единственный способ получения ID во второй таблице, и обе таблицы InnoDB).
Неактивен
Спасибо за ответ.
Tаблица B.table1 только для чтения. [ только SELECT ]
А что с MyISAM таблицами?
Расклад следующий:
A.table1 - InnoDB
A.table2 - MyISAM
B.table1 - Access DB
Неактивен
MyISAM не поддерживает транзакции. Access, разумеется, внутрь той же
транзакции MySQL Вы тоже не засунете
Неактивен
Обнаружил на таблице A.table1 Триггер делающий вставки в другие таблицы. Понимаю я правильно, что следующая конструкция вернет не ID из A.table1, а последний ID вставленной в Триггере записи?
Можно как-нибудь это обойти или поймать ID из A.table1?
INSERT INTO A.table1(); // новая запись для получения ID через Autoincrement
TRIGGER (INSERT ...)
SELECT LAST_INSERT_ID(); // то самое ID (А вот и фиг там!)
Неактивен
Нет. Вернет id из первой таблицы.
Неактивен