I’m trying to add a constraint on 2 columns in MySQL and I’m getting the following error:
lError Code: 3813. Column check constraint ‘offer_chk_1’ references
other column.
Is what I’m trying to do possible?
create table offer(
offer_id int UNSIGNED NOT NULL AUTO_INCREMENT,
buyer_id int UNSIGNED not null,
seller_id int UNSIGNED not null check(buyer_id <> seller - id),
sell_ID int unsigned not null,
offer_date char(10) not null,
offering varchar(100) not null,
trade_offer boolean default false,
purchase_offer boolean default false,
primary key(offer_id),
foreign key(buyer_id) references customer(account_id) on update cascade on delete cascade,
foreign key(seller_id) references customer(account_id) on update cascade on delete cascade,
foreign key(sell_id) references sell(sell_id) on update cascade on delete cascade,
);
MySQL only started supporting check constraints in MySQL 8.0.16 — released in April 2019.
Prior to that, the syntax was allowed (although perhaps with limitations), but nothing happened.
What is happening in your code is that you have:
Processing_Cost int check(Processing_Cost>500),
Service_Charge numeric check(.12*Processing_Cost>=Service_Charge)
These are inline check constraints. That means they are part of the column definition. You can fix this just by adding commas:
Processing_Cost int,
check (Processing_Cost > 500),
Service_Charge numeric,
check (0.12*Processing_Cost >= Service_Charge)
I like to make my constraints obvious, so I would put them after the columns and give them names:
Processing_Cost int,
Service_Charge numeric,
constraint chk_customer_details_processing_cost check (Processing_Cost > 500),
constraint chk_customer_details_service_charge check (0.12*Processing_Cost >= Service_Charge)
Here is a db<>fiddle.
Note: Don’t use char()
for column types — it pads the string with spaces. Use varchar()
.
Error Code: 3813. Column check constraint ‘customer_details_chk_2’ references other column
CREATE TABLE Customer_Details ( Customer_Id int(4) auto_increment, C_FirstName char(20), C_LastName char(20), PRIMARY KEY (Customer_Id), C_Temperature decimal(5,2), Mail_Id char(20) unique not null, Customer_Ref_Number char(10) , CONSTRAINT CHECK_UC CHECK(BINARY Customer_Ref_Number = UPPER(Customer_Ref_Number)), Processing_Cost int check(Processing_Cost>500), Service_Charge numeric check(.12*Processing_Cost>=Service_Charge) );
Advertisement
Answer
MySQL only started supporting check constraints in MySQL 8.0.16 — released in April 2019.
Prior to that, the syntax was allowed (although perhaps with limitations), but nothing happened.
What is happening in your code is that you have:
Processing_Cost int check(Processing_Cost>500), Service_Charge numeric check(.12*Processing_Cost>=Service_Charge)
These are inline check constraints. That means they are part of the column definition. You can fix this just by adding commas:
Processing_Cost int, check (Processing_Cost > 500), Service_Charge numeric, check (0.12*Processing_Cost >= Service_Charge)
I like to make my constraints obvious, so I would put them after the columns and give them names:
Processing_Cost int, Service_Charge numeric, constraint chk_customer_details_processing_cost check (Processing_Cost > 500), constraint chk_customer_details_service_charge check (0.12*Processing_Cost >= Service_Charge)
Here is a db<>fiddle.
Note: Don’t use char()
for column types — it pads the string with spaces. Use varchar()
.
#mysql #sql
#mysql #sql
Вопрос:
CREATE TABLE Customer_Details
(
Customer_Id int(4) auto_increment,
C_FirstName char(20),
C_LastName char(20),
PRIMARY KEY (Customer_Id),
C_Temperature decimal(5,2),
Mail_Id char(20) unique not null,
Customer_Ref_Number char(10) , CONSTRAINT CHECK_UC
CHECK(BINARY Customer_Ref_Number = UPPER(Customer_Ref_Number)),
Processing_Cost int check(Processing_Cost>500),
Service_Charge numeric check(.12*Processing_Cost>=Service_Charge)
);
Комментарии:
1. Ошибка и код — MySQL, поэтому я исправил тег.
Ответ №1:
MySQL начал поддерживать ограничения проверки только в MySQL 8.0.16, выпущенном в апреле 2019 года.
До этого синтаксис был разрешен (хотя, возможно, с ограничениями), но ничего не произошло.
Что происходит в вашем коде, так это то, что у вас есть:
Processing_Cost int check(Processing_Cost>500),
Service_Charge numeric check(.12*Processing_Cost>=Service_Charge)
Это встроенные ограничения проверки. Это означает, что они являются частью определения столбца. Вы можете исправить это, просто добавив запятые:
Processing_Cost int,
check (Processing_Cost > 500),
Service_Charge numeric,
check (0.12*Processing_Cost >= Service_Charge)
Мне нравится делать мои ограничения очевидными, поэтому я бы поместил их после столбцов и дал им имена:
Processing_Cost int,
Service_Charge numeric,
constraint chk_customer_details_processing_cost check (Processing_Cost > 500),
constraint chk_customer_details_service_charge check (0.12*Processing_Cost >= Service_Charge)
Здесь находится db<>fiddle.
Примечание: Не используйте char()
для типов столбцов — оно заполняет строку пробелами. Использовать varchar()
.
Комментарии:
1. Большое вам спасибо @GORDON LINOFF
2. Очень полезная информация!
Я пытаюсь создать свою первую базу данных в MySQL и столкнулся с небольшой проблемой, при попытке запустить следующую таблицу я получаю следующую ошибку:
Код ошибки 3813: ограничение проверки столбца section_ck_1 ссылается на другой столбец.
Вот таблица, которую я пытаюсь написать
create table section (
course_id varchar(8),
sec_id varchar(8),
semester varchar(6) check (semester in (`Fall`, `Winter`, `Spring`, `Summer`)),
year numeric(4,0) check (year > 1701 and year < 2100),
building varchar(15),
room_number varchar(7),
time_slot_id varchar(4),
primary key (course_id, sec_id, semester, year),
foreign key(course_id) references course(course_id) on delete cascade,
foreign key (building, room_number) references classroom on delete set null);
Я считаю, что что-то не так с моими строками «семестр» или «год», хотя я не уверен, в чем проблема и как бы я ее исправил.
1 ответ
semester varchar(6) check (semester in (`Fall`, `Winter`, `Spring`, `Summer`)),
Я думаю, вы хотели использовать одинарные кавычки для создания строковых литералов четырех сезонов. Должно получиться так:
semester varchar(6) check (semester in ('Fall', 'Winter', 'Spring', 'Summer')),
Строковые литералы заключаются в одинарные кавычки.
Обратные кавычки используются для разделения идентификаторов, таких как имена таблиц и имена столбцов. Использование обратных кавычек так, как вы сделали, казалось, будто вы намеревались semester
иметь то же значение, что и один из четырех других столбцов с именами Fall
, Winter
, Spring
, Summer
.
0
Bill Karwin
10 Фев 2020 в 07:39