mariadb 在MySQL中使用DATE作为复合外键的一部分

hmmo2u0o  于 4个月前  发布在  Mysql
关注(0)|答案(1)|浏览(67)

我有一张table,至少,

CREATE TABLE IF NOT EXISTS T (
    A int(11) NOT NULL,
    B date NOT NULL
);

字符串
AB本身稍后碰巧有FK约束,但由于这不是MWE的一部分,因此我没有包括它们。
我有另一张table:

CREATE TABLE IF NOT EXISTS U (
    C int(11) NOT NULL,
    D date NOT NULL,
    FOREIGN KEY (C) REFERENCES T(A),
    FOREIGN KEY (D) REFERENCES T(B)
);


但我得到

#1005 - Can't create table `DBName`.`u` (errno: 150 "Foreign key constraint is incorrectly formed")


我意识到问题实际上是date约束。我读到这不能做到,因为T(B)既不是唯一的,也不是主要的。然而,这应该不是一个大问题,因为我还有另一个外键T(A),它应该是唯一的。
然而,我也读到这只是MySQL中的一个问题,如果出于任何原因,你需要它,InnoDB有一个扩展支持它。我试着在最后添加ENGINE=InnoDB,但这并没有改变任何事情。
这可以做到吗?如果不能,拥有(int(11), date)外键的最佳实践是什么?
更多详情:

  • 服务器:127.0.0.1通过TCP/IP
  • 服务器类型:MariaDB
  • 服务器版本:10.4.27-MariaDB
  • 方案版本:10
  • Server charset:UTF-8 Unicode(utf8mb4)
  • 数据库客户端版本:libmysql - mysqlnd 8.2.0

在Apache/2.4.64(Win 64)下运行XAMPP。
这是在PHPMyAdmin SQL控制台中运行的,在数据库级别。

brjng4g3

brjng4g31#

你遇到这个问题是因为在MySQL中,你只能引用具有PRIMARY KEY或UNIQUE约束的列。解决这个问题的一种方法是,你可以在表T中的列A和B上创建一个复合UNIQUE约束

ALTER TABLE T
ADD UNIQUE (A, B);

字符串
这将创建没有任何错误的表U,并且外键将引用表T中的组合键(A,B)。

相关问题