2

通过论坛搜索,尝试了一堆解决方案,但似乎没有任何工作。下面是一小段代码和我使用的在线编译器。

我得到(错误号:150“外键约束的格式不正确”)。请注意,每当我尝试添加外键时,此错误都会出现在代码中的所有表中。

在线编译器: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);    

正如我在标题中提到的,代码在网上运行良好,但在 Linux 终端上通过 MariaDB 编译时失败。

MariaDB 服务器版本为 10.3.17-MariaDB

我究竟做错了什么?任何帮助将不胜感激。

4

3 回答 3

1

如果您show create table Bookings;在脚本末尾附加例如,您会得到:

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

这意味着 https://paiza.io 被配置为使用 MyISAM 作为默认引擎,因此当您自己不设置任何内容时,您会得到这样的结果。确保ENGINE=InnoDB在您的代码中进行设置,这样您就不会忽略外键。

于 2020-01-31T19:34:35.140 回答
1

好吧,关于存储引擎,我首先要说的是,并非所有存储引擎都支持外键约束。

存储引擎是管理表和数据的系统,有多种存储引擎可用,例如:MyISAM 或 InnoDb。(默认来自 MySQL 5.6 InnoDB)

每个存储引擎都有自己的特性和独特的特性,可以在特定的情况下使用。大多数时候你并不“关心”存储引擎,除非你想使用一些特定的功能。

如果您不确定要选择哪个存储引擎,请坚持使用默认值并使用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_IDBookings 上的列不是索引字段。如果我更改表定义并向其添加 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)
);
于 2020-01-31T19:16:08.743 回答
0

上一个答案是正确的。

MariaDB 要求引用的列是 PK 或索引的(最好是唯一索引的)。

如果添加索引不能帮助解决问题,请检查您的默认存储引擎是否设置为 MyISAM 而不是 InnoDB。

显示全局变量,如“%storage%”;

于 2020-01-31T19:34:14.697 回答