Экспорт в MySQL строк с совпадающими ID

Samail
На сайте с 10.05.2007
Offline
361
1335

Нужно добавить в базу информацию из другой базы. Но при импорте, если ID добавляемой строки совпадает с ID уже имеющейся, выдает ошибку и эта строка не вставляется.

Как сделать так, чтоб ID импортируемых строк не учитывался, а присваивался новый? Т.е. если последний ID в таблице 10, вставляемые строки получали ID 11,12,13 и т.д. независимо от того какой ID они до этого имели.

[Удален]
#1

эмм...

Если на поле ID в базе поставить auto_increment то можно вставлять просто вот так

INSERT INTO table (id,field1,field2..) VALUES ('','a','b'...)

или

INSERT INTO table SET `field`='a', `field2`='b'

Т.е. если не указывать собственно ID, он присвоится сам

А просто избежать ошибки можно используя INSERT IGNORE

Если ID жестко прописан в импортируемом файле, то средствами самого SQL так не сделать, надо крутить с скриптингом.

J
На сайте с 02.02.2009
Offline
53
#2

Ну так просто не вставляйте id. Делов-то!

Автоинкремент сработает и всё будет хорошо

grey109
На сайте с 15.06.2005
Offline
160
#3

Как вариант: в текстовом редакторе заменить "INSERT INTO `имя таблицы` VALUES (" на "INSERT INTO `имя таблицы` VALUES (1000". А потом делать импорт.

Т.е.

INSERT INTO `имя таблицы` VALUES (1, ...

INSERT INTO `имя таблицы` VALUES (2, ...

заменено будет на

INSERT INTO `имя таблицы` VALUES (1001, ...

INSERT INTO `имя таблицы` VALUES (1002, ...

Samail
На сайте с 10.05.2007
Offline
361
#4
neolord:
Т.е. если не указывать собственно ID, он присвоится сам
jumash:
Ну так просто не вставляйте id. Делов-то!

Как сделать, чтоб он не вставлялся при экспорте из первой базы?

Samail добавил 06.08.2009 в 17:28

grey109:
заменено будет на

INSERT INTO `имя таблицы` VALUES (1001,

grey109, ну у меня сейчас примерно по такому принципу и происходит. (По принципу, чтоб самый маленький ID первой базы, был заведомо больше самого большого ID второй базы). Но переносить данные мне много раз придется, хоть раз но всё равно ошибусь.

grey109
На сайте с 15.06.2005
Offline
160
#5

Хорошо, другой вариант: открывай импортируемый файл в ворде, CTRL+F

заменить:

VALUES (^#,

на

VALUES ('',

потом заменить

VALUES (^#^#,

на

VALUES ('',

и т.д.

VALUES (^#^#^#,

на

VALUES ('',

ЗЫ: знаю что изврат, но за 2 минуты получешь то что надо.

V1
На сайте с 30.03.2006
Offline
52
#6

отключаем автоинкремент: ALTER TABLE bd.table CHANGE col_auto_inc col_auto_inc INT(11) NOT NULL;

импортируем;

Выполняем хитрый скрипт:

set @n:=0;

update table as t set col_auto_inc=(select @n:=@n+1);

включаем автоинкремент:

ALTER TABLE bd.table CHANGE col_auto_inc col_auto_inc INT(11) AUTO_INCREMENT NOT NULL;

Не пользуйтесь этим вариантом если необходимо оставить id некоторых записей старыми

Samail
На сайте с 10.05.2007
Offline
361
#7

grey109, спасибо за идею.

Тогда наверное лучше: VALUES (^# -> VALUES ( (ткнуть несколько раз) и под конец VALUES ( , -> VALUES ('',

Если один раз создать макрос, то в дальнейшем будет терпимо.

…а нет в phpMyAdmin функции, чтоб просто в дамп содержимое одного из полей не вставлять?

Samail добавил 06.08.2009 в 18:10

Vladimir1:
Не пользуйтесь этим вариантом если необходимо оставить id некоторых записей старыми

Нужно оставить, от ID адрес ссылки на страницу зависит.

Samail добавил 07.08.2009 в 08:15

Что-то после обработки в Word, дамп вообще не хочет экспортироваться.

Пока решаю обходным путем. Смотрю во второй базе максимальный ID и выполняю в базе источнике запрос:

alter table название_таблицы modify id int(11);

alter table название_таблицы drop primary key;
update название_таблицы set id=0;
alter table название_таблицы auto_increment = нужный номер;
alter table название_таблицы modify id int(11) not null auto_increment primary key;

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий