mysql - SQL 代码在在线编译器上运行良好,但在 Linux 终端中由 MariaDB 编译时失败(错误号 : 150))

标签 mysql mariadb mariadb-10.3

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

我得到(errno: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

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

最佳答案

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

存储引擎是管理表和数据的系统,有多种存储引擎可用,例如: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

我认为问题在于 Bookings 上的列 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)
);

关于mysql - SQL 代码在在线编译器上运行良好,但在 Linux 终端中由 MariaDB 编译时失败(错误号 : 150)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60009749/

相关文章:

mysql - 在可空字段上定义的 MySql 唯一约束到底是如何工作的?

regex - MariaDB 中的正则表达式替换

mysql - 启动 MySQL 时出现错误 "Plugin ' InnoDB 注册为存储引擎失败”

jquery - 如何使用jquery从数据库加载多个字段到表单?

mysql - 如何将具有多个表的 PostgreSQL 数据库转储读入 mySQL

mysql - 如何使用 codeigniter 插入和更新多个选定值?

mysql - 如何根据节点级别查找父级

php - 将 <script></script> 用 php 保存到 mysql 数据库中

sql - 在数据库中存储哈希的最佳方式

mysql - MariaDB/MySQL 将 DEFAULT NULL 添加到列定义中,如何更改?