首页 文章

MySQL#1215问题

提问于
浏览
1

我在数据库中创建此表时遇到问题 . 问题是:

错误:1215无法添加外键约束 .

这是我要做的表:

CREATE TABLE Customer(customer_reference int UNIQUE AUTO_INCREMENT,主键(customer_reference),forename VARCHAR(20),surname VARCHAR(20),contact VARCHAR(15),email VARCHAR(50),building VARCHAR(5),road VARCHAR(40) ,城市VARCHAR(30),邮政编码VARCHAR(7),县VARCHAR(30));

CREATE TABLE Invoice(invoice_reference int UNIQUE AUTO_INCREMENT,customer_reference int UNIQUE,主键(invoice_reference),外键(customer_reference)引用Customer(customer_reference),invoice_cost DECIMAL(20,2),付费位,order_date DATETIME,delivery_date DATE);

CREATE TABLE Stock(容器VARCHAR(10)UNIQUE NOT NULL DEFAULT 0,主键(容器),SBADNLon INT(4),SBADNFel INT(4),SBADNSou INT(4),CHECK(container =(“SBADN-Lon”> 0,“SBADN-Fel”> 0,“SBADN-Sou”> 0))); / 这只显示了3个可能的容器变体每个属性都存储一个值,其中包含库存中可用模型的数量 /

CREATE TABLE Items_Purchased(container_ordered VARCHAR(10)NOT NULL,invoice_reference int,container VARCHAR(10)NOT NULL DEFAULT“None”,container_cost decimal(20,2)NULL,container_size VARCHAR(6)NOT NULL,color VARCHAR(5)NOT NULL,等级CHAR(1)NOT NULL,depot VARCHAR(15)NOT NULL,container_type VARCHAR(20)NOT NULL,conditionn VARCHAR(4)NOT NULL,主键(container_ordered,container_size,color,grade,depot,container_type,conditionn ),外键(invoice_reference)引用Invoice(invoice_reference),外键(容器)引用Stock(容器),外键(container_size)引用Container_Size(container_size),外键(颜色)引用颜色(颜色),外键(等级) )引用等级(等级),外键(仓库)引用库(仓库),外键(container_type)引用Container_Type(container_type),外键(conditionn)引用Conditionn(conditionn));

CREATE TABLE Depot(depot VARCHAR(15)NOT NULL,container_ordered VARCHAR(10)NOT NULL,主键(depot),外键(container_ordered)引用Items_Purchased(container_ordered),CHECK(depot =(“london”,“felixstowe”, “南安普敦”)));

CREATE TABLE Container_Type(container_type VARCHAR(20)NOT NULL,container_ordered VARCHAR(10)NOT NULL,主键(container_type),外键(container_ordered)引用Items_Purchased(container_ordered),CHECK(container_type =(“dry”,“inslated”, “refreigerated”,“open top”,“tunnel”)));

CREATE TABLE Container_Size(container_size VARCHAR(6)NOT NULL,container_ordered VARCHAR(10)NOT NULL,主键(container_size),外键(container_ordered)引用Items_Purchased(container_ordered),CHECK(container_size =(“small”,“medium”, “大”)));

CREATE TABLE颜色(颜色VARCHAR(5)NOT NULL,container_ordered VARCHAR(10)NOT NULL,主键(颜色),外键(container_ordered)引用Items_Purchased(container_ordered),CHECK(color =(“black”,“green”) ));

CREATE TABLE Conditionn(conditionn VARCHAR(4)NOT NULL,container_ordered VARCHAR(10)NOT NULL,主键(conditionn),外键(container_ordered)引用Items_Purchased(container_ordered),CHECK(conditionn =(“new”,“used”) ));

CREATE TABLE Grade(等级CHAR(1)NOT NULL,container_ordered VARCHAR(10)NOT NULL,主键(等级),外键(container_ordered)引用Items_Purchased(container_ordered),CHECK(grade =(“a”,“b”, “C”)));

提前致谢

4 回答

  • 0

    首先,我相信最好为你的 table 使用另一个主键 .

    所有外键约束的数据类型应与将字段定义为原始表中的主键的方式完全相同 . 例如,如果容器在Stock表中是varchar(20),则必须在Items_Purchased表中为varchar(20) .

    此外,定义的排序规则(如果有)将是相同的,例如对于那些列的utf-8 . 请注意,您的表可能在同一个合并中,但列可能有不同,请正确检查 .

    最后,确保外键值的值是唯一的,并且外键列的定义包括 not null

    参考:MySQL Error 1215: Cannot add foreign key constraint

  • 0

    以下2条规则可能导致错误:

    invoice_reference int UNIQUE auto_increment
    foreign key (invoice_reference) references Invoice (invoice_reference)
    

    应该在Invoice表(invoice_reference)中指定auto_increment属性 .

  • 0

    我的猜测是,为了创建外键引用,必须在创建引用之前创建引用的表 . 例如,检查您的第三个表 . 它包含一个客户参考,它工作正常 .

    现在,如果您看到DEPOT表和Items_Purchased表,则两者都包含彼此的外键引用 . 现在考虑一下,为了从Depot引用Items_Purchased,Items_purchased必须在Depot之前出现,反之亦然,对于引用也必须是真的Items_Purchased to Depot . 这永远不可能 .

    请相应地重新构建您的模式,并排序应首先创建哪个表,以便从该表中获取引用 .

    这更像是在Java中编译代码时遇到的前向引用错误 .

  • 0

    我尝试使用ALTER表命令分别插入每个外键定义,并且它很好 - 可能是某种形式的引用问题?

相关问题