Итак, я попытался создать следующие две таблицы с помощью 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))
При создании подкатегории отображается такая ошибка запроса:
В таблице подкатегорий нет двух автоматически увеличиваемых столбцов, есть только subCatId. То, что должно быть сделано?
Что произойдет, если catId и subcatId будут принимать одинаковые значения? Я имею в виду, если catId = 1 и subcatId = 1?
да, теперь это работает, я изменил поле subcatId на 'auto_increment unique'
Кажется, вы используете синтаксис 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, как сказано, но ошибка все равно появляется.
Я изменил строку «subcatId INT NOT NULL AUTO_INCREMENT» на «subcatId INT NOT NULL AUTO_INCREMENT UNIQUE», теперь она работает.
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 автоматически увеличивает оба столбца при создании второй таблицы.
Это то, что утверждает 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)
ограничения должны иметь уникальные имена, чтобы их можно было идентифицировать, не так ли?
Имя ПК по умолчанию - PRIMARY
. Ключевое слово CONSTRAINT
нигде в MySQL не требуется; может быть указано имя.
Хорошо, я раньше работал с mssql.
Достаточно ли только PRIMARY для объявления pk?
@ LizardKing_96 - PRIMARY
получает синтаксическую ошибку; ему нужен PRIMARY KEY
. Примечание. В MySQL PK по определению кластеризован, уникален и является индексом.
Либо вам придется сделать
subCatId
какPK
, либо сделать его какUnique
. Потому что это столбецAuto increment
.