Phpmyadmin показывает двойное приращение ошибки с невозможностью двух столбцов

Итак, я попытался создать следующие две таблицы с помощью phpmyadmin.

create table category (
catId int identity(1,1),
catName varchar(20),

Constraint pk_category
PRIMARY KEY(catId))

create table subcategory (
subCatId INT IDENTITY(1,1),
catId INT,
subCatName VARCHAR(20),

CONSTRAINT pk_subcategory
PRIMARY KEY(catId,subCatId),

CONSTRAINT fk_subcat_cat
FOREIGN KEY(catID)
REFERENCES category(catId))

При создании подкатегории отображается такая ошибка запроса:

1075 - Неверное определение таблицы; может быть только один автоматический столбец, и он должен быть определен как ключ.

В таблице подкатегорий нет двух автоматически увеличиваемых столбцов, есть только subCatId. То, что должно быть сделано?

Либо вам придется сделать subCatId как PK, либо сделать его как Unique. Потому что это столбец Auto increment.

Kaushik 17.12.2018 07:15

Что произойдет, если catId и subcatId будут принимать одинаковые значения? Я имею в виду, если catId = 1 и subcatId = 1?

LizardKingLK 17.12.2018 08:18

да, теперь это работает, я изменил поле subcatId на 'auto_increment unique'

LizardKingLK 17.12.2018 08:47
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
219
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Кажется, вы используете синтаксис SQL Server, но работаете с MySQL. Используйте правильный синтаксис, и он должен работать:

CREATE TABLE category (
    catId INT NOT NULL AUTO_INCREMENT,
    catName VARCHAR(20),
    PRIMARY KEY (catId)
)

CREATE TABLE subcategory (
    subCatId INT NOT NULL AUTO_INCREMENT,
    catId INT,
    subCatName VARCHAR(20),
    FOREIGN KEY (catId) REFERENCES category (catId),
    PRIMARY KEY (subCatId)
);

IDENTITY в SQL Server примерно соответствует AUTO_INCREMENT в MySQL.

Да, я использовал auto_increment, как сказано, но ошибка все равно появляется.

LizardKingLK 17.12.2018 08:00
Мой код отлично работает в этой демонстрации. У вас есть другие проблемы с вашим кодом.
Tim Biegeleisen 17.12.2018 08:01

Я изменил строку «subcatId INT NOT NULL AUTO_INCREMENT» на «subcatId INT NOT NULL AUTO_INCREMENT UNIQUE», теперь она работает.

LizardKingLK 17.12.2018 08:46

It is only available for the MyISAM Storage Engine Only one numeric auto_increment value is allowed. Each auto_increment must be have associated column to define uniqueness from other auto_increment values within the same table.

Эта ссылка может рассказать вам больше о это.

Note: Don't do that, don't have a second auto incremented column at all. Do you really need a second auto incremented value? What for? A description of the actual problem you are trying to solve would help others help you better. I think you have only told here how you tried to solve a problem and not what the actual problem is.

Для catId верхней таблицы (таблицы категорий) не задано значение auto_increment. Поэтому я не хочу, чтобы catId таблицы подкатегорий был auto_increment. Но phpmyadmin автоматически увеличивает оба столбца при создании второй таблицы.

LizardKingLK 17.12.2018 08:04
Ответ принят как подходящий

Это то, что утверждает MySQL

There can be only one AUTO_INCREMENT column per table, it must be indexed, and it cannot have a DEFAULT value. An AUTO_INCREMENT column works properly only if it contains only positive values. Inserting a negative number is regarded as inserting a very large positive number. This is done to avoid precision problems when numbers “wrap” over from positive to negative and also to ensure that you do not accidentally get an AUTO_INCREMENT column that contains 0.

Итак, в соответствии с вашим требованием у вас есть следующие варианты.

  • Сделайте subCatId как Primary Key
  • Или сделайте колонку как Unique

У вас есть

Constraint pk_category
PRIMARY KEY(catId)

Вместо этого просто скажи

PRIMARY KEY(catId)

ограничения должны иметь уникальные имена, чтобы их можно было идентифицировать, не так ли?

LizardKingLK 21.12.2018 11:03

Имя ПК по умолчанию - PRIMARY. Ключевое слово CONSTRAINT нигде в MySQL не требуется; может быть указано имя.

Rick James 21.12.2018 18:19

Хорошо, я раньше работал с mssql.

LizardKingLK 29.12.2018 17:46

Достаточно ли только PRIMARY для объявления pk?

LizardKingLK 29.12.2018 17:48

@ LizardKing_96 - PRIMARY получает синтаксическую ошибку; ему нужен PRIMARY KEY. Примечание. В MySQL PK по определению кластеризован, уникален и является индексом.

Rick James 29.12.2018 17:56

Другие вопросы по теме