MySQL автоинкремент - PullRequest
       10

MySQL автоинкремент

0 голосов
/ 01 апреля 2010

У меня есть таблица с полем автоинкремента, но мне нужно перенести таблицу в другую таблицу в другой базе данных. Будет ли значение поля 1 равно 1, значение поля 2 равно 2 и т. Д.?

Также, если база данных повреждена и мне нужно восстановить данные, будет ли эффект автоприращения каким-либо образом? будет значение меняться? (например, если первая строка, id (auto-inc) = 1, name = john, country = UK .... поле id останется 1?) Я спрашиваю, потому что, если другая таблица ссылается на это значение, все данные будут выйти из синхронизации при изменении этого поля.

Ответы [ 4 ]

2 голосов
/ 01 апреля 2010

Передача данных не будет проблемой, если вы полностью укажете значения auto_increment. MySQL позволяет вставлять все, что вы хотите в поле auto_increment, но делает фактический auto_increment только в том случае, если значение, которое вы вставляете, равно 0 или NULL. По крайней мере, в моей копии MySQL версии 5.0 она автоматически настроит значение auto_increment, чтобы учесть то, что вы вставили:

mysql> create table test (x int auto_increment primary key);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test (x) values (10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test (x) values (null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test (x) values (0);   
Query OK, 1 row affected (0.00 sec)
mysql> insert into test (x) values (5);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+----+
| x  |
+----+
| 5  | <--inserted '5' (#4)
| 10 | <--inserted '10' (#1)
| 11 | <--inserted 'null' (#2)
| 12 | <--inserted '0' (#3)
+----+
3 rows in set (0.00 sec)

Вы также можете настроить следующее значение auto_increment таблицы следующим образом:

mysql> alter table test auto_increment=500;
Query OK, 4 rows affected (0.04 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into test (x) values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|              500 | 
+------------------+
1 row in set (0.01 sec)
2 голосов
/ 01 апреля 2010

Похоже, вы пытаетесь отдельно вставить данные в две отдельные базы данных в одном и том же порядке и используете поле автоинкремента, чтобы связать две строки. Кажется, вы в основном спрашиваете, можно ли полагаться на то, что автоинкремент будет одинаковым в обеих базах данных, если данные вставлены в одном и том же порядке.

Если так, ответ - нет - вы не можете полагаться на это поведение. Для автоинкремента допустимо пропустить значение, например см. Здесь .

Но, может быть, вы спрашиваете, может ли значение автоинкремента внезапно измениться на другое значение после того, как оно записано и зафиксировано? Нет - они не изменятся в будущем (если, конечно, вы не измените их явно).

Это отвечает на ваш вопрос? Если нет, возможно, вы сможете объяснить свой вопрос еще раз.

1 голос
/ 01 апреля 2010

Использование MySQL backup сделает это, если вы создаете свои собственные операторы вставки, убедитесь, что вы включили свое поле id и в него будет вставлено значение (это не похоже на MSSQL, где вы должны установить identity_insert), нужно следить за тем, чтобы что если вы генерируете DDL, он иногда генерирует «некорректно» для вашего столбца идентификаторов (т. е. в нем говорится, что начальная точка соответствует вашему последнему значению идентификатора? вам может не понадобиться такое поведение).

1 голос
/ 01 апреля 2010

SELECT INTO должен сохранять идентичные идентификаторы на целевой таблице

http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-select-into-table.html

...