MySQL is returning that error (most likely) because there is no unique index defined on the id
column. (MySQL requires that there be a unique index. The other possibility, which you would have already figured out, is that there can be only one column defined as AUTO_INCREMENT within the table.)
To get that column to be an AUTO_INCREMENT, you can add either a UNIQUE constraint or a PRIMARY KEY constraint on the id
column. For example:
ALTER TABLE `blog` ADD CONSTRAINT `blog_ux` UNIQUE (`id`) ;
(Note that this statement will return an error if any duplicate values exist for the id column.)
Alternatively, you can make the id column the PRIMARY KEY of the table (if the table doesn’t already have a PRIMARY KEY constraint defined).
ALTER TABLE `blog` ADD PRIMARY KEY (`id`) ;
(Note that this statement will return an error if any duplicate value exist for the id column, OR if there are any NULL values stored in that column, of if there is already a PRIMARY KEY constraint defined on the table.)
2 / 2 / 1 Регистрация: 25.12.2016 Сообщений: 115 |
|
1 |
|
09.01.2017, 08:48. Показов 14816. Ответов 11
При создании таблицы вышла ошибка: Что сделано не правильно. Миниатюры
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
09.01.2017, 08:48 |
11 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,178 |
|
09.01.2017, 09:48 |
2 |
Что сделано не правильно Как минимум, у тебя столбец объявлен как PRIMARY, т.е. PK и при этом может иметь значение NULL. Что неверно по определению PK.
0 |
2 / 2 / 1 Регистрация: 25.12.2016 Сообщений: 115 |
|
09.01.2017, 11:55 [ТС] |
3 |
Да, тут была ошибка, стоит галочка на null, что, действительно не должно быть. Интересно, а что означает галочка на A_l, нужна ли она там в строке где ставится id?
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,178 |
|
09.01.2017, 12:35 |
4 |
что означает галочка на A_l, нужна ли она там в строке где ставится id Полагаю, что AUTO_INCREMENT. А нужна или нет зависит от того, каким способом ты формируешь значение id.
0 |
2 / 2 / 1 Регистрация: 25.12.2016 Сообщений: 115 |
|
09.01.2017, 12:38 [ТС] |
5 |
Но ведь у меня в индексе уже указано PRIMARY что и означает AUTO_INCREMENT, или PRIMARY означает что-то другое.
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,178 |
|
09.01.2017, 13:19 |
6 |
уже указано PRIMARY что и означает AUTO_INCREMENT Нет.
1 |
410 / 364 / 142 Регистрация: 09.04.2011 Сообщений: 1,041 |
|
09.01.2017, 14:28 |
7 |
FK (Foreign Key),то он ссылается на PK дочерней таблицы. Это не так: SZV, строго говоря, ваш вопрос к MySQL не относится, т.к. он не умеет ругаться на русском
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,178 |
|
09.01.2017, 14:57 |
8 |
1. FK ссылается на родительскую Ну конечно это моя описка.
2. не обязательно PK, достаточно unique Я в курсе, но все таки чаще на PK. Кроме того, я считаю, что в целях обучения для человека с низким уровнем знаний перечислять все возможные варианты нет смысла — все равно не уляжется.
0 |
2 / 2 / 1 Регистрация: 25.12.2016 Сообщений: 115 |
|
09.01.2017, 15:28 [ТС] |
9 |
Ребята вы так много и хорошо сказали, что я не уловил главное. Если мне достаточно поставить галочку на A_l для AUTO_INCREMENT то тогда нет ни какого смысла указывать индекс PRIMARY? или все таки указывать.
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,178 |
|
09.01.2017, 15:41 |
10 |
я не уловил главное Еще раз: PRIMARY KEY и AUTO_INCREMENT — это перпендикулярные вещи. PK может не быть A_I и наоборот, A_I может не быть PK.
0 |
2 / 2 / 1 Регистрация: 25.12.2016 Сообщений: 115 |
|
09.01.2017, 16:19 [ТС] |
11 |
Ладно сделаю вид, что понял. Сам для себя уяснил что суррогатные ключи помогают в работе реальным ключам, т.е указав PRIMARY KEY галочку на A_l лучше все таки поставить (это и будет суррогатный ключ), даже боюсь спрашивать о том, что если я буду использовать только суррогатный ключ: будет ли id отображаться по порядку? Сам изучаю php даже не первый год, а первую неделю, так что… все очень интересно.
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,178 |
|
09.01.2017, 16:36 |
12 |
будет ли id отображаться по порядку Нет. В общем случае отсутствие «дырок» в нумерации никто не гарантировал.
0 |
Доброго дня,
Читаю учебник по MySQL и при выполнении примеров из него, у меня не получается создать новую таблицу с AUTO_INCREMENT’ом. Код:
CREATE TABLE album (
artist_id SMALLINT(5) NOT NULL,
album_id SMALLINT(4) NOT NULL AUTO_INCREMENT,
album_name CHAR(128) DEFAULT NULL,
PRIMARY KEY (artist_id, album_id)
);
Ошибка:
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
Я понимаю суть того на что оно ругается, но не понимаю — почему? У меня же указан единственный столбец с AUTO_INCREMENT и он является частью индекса. В книге идентичный пример работает почему-то. Если сделать PRIMARY KEY только из album_id — таблица создается.
-
Вопрос заданболее трёх лет назад
-
3088 просмотров
В книге идентичный пример работает почему-то
Фокусы руками, найдите различие:
mysql> CREATE TABLE album ( artist_id SMALLINT(5) NOT NULL, album_id SMALLINT(4) NOT NULL AUTO_INCREMENT, album_name CHAR(128) DEFAULT NULL, PRIMARY KEY (artist_id, album_id) ) engine=innodb;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql> CREATE TABLE album ( artist_id SMALLINT(5) NOT NULL, album_id SMALLINT(4) NOT NULL AUTO_INCREMENT, album_name CHAR(128) DEFAULT NULL, PRIMARY KEY (artist_id, album_id) ) engine=myisam;
Query OK, 0 rows affected (0,00 sec)
mysql>
У вас с книгой разные дефолтные движки, в будущем от этого могут ещё сюрпризы возникать. Очень разные myisam и innodb по поведению, возможностям и ограничениям.
Пригласить эксперта
-
Показать ещё
Загружается…
05 июн. 2023, в 22:21
1500 руб./за проект
05 июн. 2023, в 22:02
500 руб./за проект
05 июн. 2023, в 21:36
100000 руб./за проект
Минуточку внимания
I try to «alter Table»
I need one more AI field, not key…
«List»
ID INT(11):PK Not Null AutoIn..
Name VARCHAR
UserID INT(11):FK Not Null
edit BOOL
and now i need one more field «sortpos» as AI.
I try it with MySQL Workbench
ALTER TABLE `**mydb**`.`List`
ADD COLUMN `sortpos` INT(11) NOT NULL AUTO_INCREMENT AFTER `edit`;
Can u help me?
Thx
asked Mar 12, 2014 at 21:32
7
You can’t get better error message than this one. You already have ID defined as Auto Increment in your table. Now you are trying to add another field sortpos as auto increment which is not allowed. One table can only have one auto increment which must be defined as primary key.
Remove AUTO_INCREMENT from the alter statement and create a trigger to increment the new column.
answered Mar 12, 2014 at 23:26
RizRiz
1,11915 silver badges23 bronze badges
1
Based on your comments, you are confusing user interface with table data. The table only needs to have one ID, if you want you can create a query like this:
SELECT ID, ID AS SORTPOS, NAME FROM List
But you don’t even need a query for that, you should do it only at user interface level.
Plus, what you show in your comment is merely the heading of a list, not the list itself.
answered Mar 14, 2014 at 6:41
korianderkoriander
3,0922 gold badges15 silver badges23 bronze badges
To fix this error, you need to add PRIMARY KEY to auto_increment field. Let us now see how this error occurs −
Here, we are creating a table and it gives the same error −
mysql> create table DemoTable ( StudentId int NOT NULL AUTO_INCREMENT, StudentName varchar(40), StudentAge int ); ERROR 1075 (42000) : Incorrect table definition; there can be only one auto column and it must be defined as a key
To solve the above error, you need to add PRIMARY KEY with AUTO_INCREMENT. Let us first create a table −
mysql> create table DemoTable ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(40), StudentAge int ); Query OK, 0 rows affected (1.01 sec)
Insert some records in the table using insert command −
mysql> insert into DemoTable(StudentName,StudentAge) values('Chris Brown',19); Query OK, 1 row affected (0.30 sec) mysql> insert into DemoTable(StudentName,StudentAge) values('David Miller',18); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable(StudentName,StudentAge) values('John Doe',20); Query OK, 1 row affected (0.11 sec)
Display all records from the table using select statement :
mysql> select *from DemoTable;
This will produce the following output −
+-----------+--------------+------------+ | StudentId | StudentName | StudentAge | +-----------+--------------+------------+ | 1 | Chris Brown | 19 | | 2 | David Miller | 18 | | 3 | John Doe | 20 | +-----------+--------------+------------+ 3 rows in set (0.00 sec)