Код ошибки: 3813. Ограничение проверки столбца ‘customer_details_chk_2’ ссылается на другой столбец

#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. Очень полезная информация!