SQL Код работает нормально на онлайн-компиляторе, но завершается ошибкой при компиляции MariaDB в Linux Терминале (номер ошибки: 150) - PullRequest
2 голосов
/ 31 января 2020

Просматривал по форумам, пробовал кучу решений, но вроде ничего не работает. Ниже приведен небольшой фрагмент кода и онлайн-компилятор, который я использовал.

Я получаю (ошибка: 150 «Ограничение внешнего ключа сформировано неправильно»). Обратите внимание, что эта ошибка появляется во всех таблицах кода, всякий раз, когда я пытаюсь добавить внешний ключ.

Online Complier: https://paiza.io/en/languages/mysql

Код :

-- CREATING AND INSERTING VALUES INTO THE BOOKINGS TABLE WITHOUT FK--
create table Bookings(
Booking_ID varchar(9) NOT NULL,
Client_ID varchar(6) NOT NULL,
PT_ID varchar(4) NOT NULL,
Booking_Date Date NOT NULL, 
Start_Time time NOT NULL,
End_Time time NOT NULL,
Focus_ID varchar(3) NOT NULL,
Staff_ID varchar(4) NOT NULL,
PRIMARY KEY (Booking_ID)
);

INSERT INTO Bookings
VALUES
('B00000001','C00001','T001','2020-01-1','19:30:00','20:15:00','F01','S002'),
('B00000002','C00023','T001','2020-01-1','09:00:00','09:30:00','F02','S001'),
('B00000007','C00156','T003','2020-01-1','10:00:00','11:00:00','F04','S003');


-- CREATING AND INSERTING VALUES INTO THE CLIENT TABLE --
create table Client(
Client_ID varchar(6) NOT NULL,
Client_Name varchar(20) NOT NULL,
Height_cm decimal(5,2) NOT NULL,
Weight_kg decimal(6,2) NOT NULL,
Ph_Num varchar(14) NOT NULL,
PRIMARY KEY (Client_ID),
FOREIGN KEY (Client_ID) 
    REFERENCES Bookings(Client_ID)
);

-- ALTERING BOOKINGS TABLE WITH FOREIGN KEYS --

ALTER TABLE Bookings
ADD
FOREIGN KEY (Client_ID) 
    REFERENCES Client(Client_ID);    

Как я уже упоминал в заголовке, код отлично работает в сети, но не работает при компиляции через MariaDB на Linux Terminal.

Версия сервера MariaDB - 10.3.17-MariaDB

Что я делаю не так? любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 31 января 2020

Если вы добавите, например, show create table Bookings; в конце скрипта, вы получите:

CREATE TABLE `Bookings` ([…]) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4
                              ^^^^^^^^^^^^^

Это означает, что https://paiza.io настроен на использование MyISAM в качестве движка по умолчанию, так что это то, что вы получаете, когда вы надеваете Не устанавливай себя. Убедитесь, что в вашем коде установлено ENGINE=InnoDB, чтобы не игнорировать внешние ключи.

1 голос
/ 31 января 2020

Хорошо, первое, что я сказал о механизме хранения, это то, что не все механизмы хранения поддерживают ограничения внешнего ключа.

Механизм хранения - это система, которая управляет таблицей и данными, существует несколько механизмов хранения, таких как: MyISAM или InnoDb. (С MySQL 5.6 InnoDB по умолчанию)

Каждый механизм хранения имеет свои особенности и уникальные характеристики, которые можно использовать в определенных c ситуациях. Большую часть времени вы не «заботитесь» о подсистеме хранилища, если вы не хотите использовать некоторые специфические c функции.

Если вы не уверены, какой механизм хранилища выбрать, просто придерживайтесь значения по умолчанию и используйте InnoDB

Для получения дополнительной информации о механизмах хранения см. справочное руководство MySQL. (Я настоятельно рекомендую вам, если вы хотите учиться и понимать)

https://dev.mysql.com/doc/refman/8.0/en/innodb-introduction.html https://dev.mysql.com/doc/refman/8.0/en/myisam-storage-engine.html

Я думаю, что проблема заключается в этот столбец Client_ID в бронировании не является индексированным полем. Если я изменю определение таблицы и добавлю к ней ограничение INDEX, все будет работать.

create table Bookings( Booking_ID varchar(9) NOT NULL, Client_ID varchar(6) NOT NULL,  PT_ID varchar(4) NOT NULL, Booking_Date Date NOT NULL, Start_Time time NOT NULL, End_Time time NOT NULL, Focus_ID varchar(3) NOT NULL, Staff_ID varchar(4) NOT NULL,  PRIMARY KEY (Booking_ID), INDEX (Client_ID) );

INSERT INTO Bookings
VALUES
('B00000001','C00001','T001','2020-01-1','19:30:00','20:15:00','F01','S002'),
('B00000002','C00023','T001','2020-01-1','09:00:00','09:30:00','F02','S001'),
('B00000007','C00156','T003','2020-01-1','10:00:00','11:00:00','F04','S003');

create table Client(
Client_ID varchar(6) NOT NULL,
Client_Name varchar(20) NOT NULL,
Height_cm decimal(5,2) NOT NULL,
Weight_kg decimal(6,2) NOT NULL,
Ph_Num varchar(14) NOT NULL,
PRIMARY KEY (Client_ID),
FOREIGN KEY (Client_ID) 
    REFERENCES Bookings(Client_ID)
);
0 голосов
/ 31 января 2020

Предыдущий ответ правильный.

MariaDB требует, чтобы указанный столбец был PK или проиндексирован (желательно с уникальным индексированием).

Если добавление индекса не помогает решить проблему, то проверьте настройки по умолчанию. механизм хранения, чтобы увидеть, установлен ли он на MyISAM, а не на InnoDB.

показать глобальные переменные, такие как "% storage%";

...