代码之家  ›  专栏  ›  技术社区  ›  JimB814

向现有表添加外键[重复]

  •  0
  • JimB814  · 技术社区  · 7 年前

    顺序表:

    CREATE TABLE Ordre (
      OrdreID   INT NOT NULL,
      OrdreDato DATE DEFAULT NULL,
      KundeID   INT  DEFAULT NULL,
      CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
      CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
    )
      ENGINE = InnoDB;
    

    产品表:

    CREATE TABLE Produkt (
      ProduktID          INT NOT NULL,
      ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
      ProduktFarge       VARCHAR(20)  DEFAULT NULL,
      Enhetpris          INT          DEFAULT NULL,
      CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
    )
      ENGINE = InnoDB;
    

    CREATE TABLE Ordrelinje (
      Ordre         INT NOT NULL,
      Produkt       INT NOT NULL,
      AntallBestilt INT DEFAULT NULL,
      CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
      CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
      CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
    )
      ENGINE = InnoDB;
    

    所以当我尝试在 ORDRELINJE 我得到的表:

    错误代码:1452。无法添加或更新子行:外键约束失败( srdjank Ordrelinje ,约束 Ordrelinje_fk Ordre )参考文献 秩序 ( OrdreID ))

    我是在监督什么还是知道该怎么做?

    0 回复  |  直到 6 年前
        1
  •  191
  •   Rahul    6 年前

    取自 Using FOREIGN KEY Constraints

    外键关系涉及一个包含 中心数据值和具有相同值的子表 桌子。

    子表中没有匹配的外键值

    所以你的错误 Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails 本质上意味着,您正在尝试向 Ordrelinje 中不存在匹配行(OrderID)的表 Ordre

    必须首先将行插入到 秩序 桌子。

        2
  •  41
  •   Aleksi Baklanov    6 年前

    Ordre 表没有引用 OrdreID

    插入值 Ordrelinje 秩序 表和使用相同 奥德里德 在里面 Orderlinje 桌子。

        3
  •  32
  •   Humphrey    7 年前

    必须删除子表中与父表主键没有任何对应外键值的数据。或者删除子表中的所有数据,然后插入与父表中主键具有相同外键值的新数据。这应该管用。 这里还有一个 youtube video

        4
  •  30
  •   Mr-Faizan    7 年前

    问题是外键约束。默认情况下(将“外键检查”设置为1)。FOREIGN\u KEY\u CHECKS选项指定是否检查InnoDB表的外键约束。 MySQL - SET FOREIGN_KEY_CHECKS

    我们可以在运行查询之前将外键检查设置为禁用。 Disable Foreign key

    在运行查询之前执行其中一行,然后就可以成功运行查询。:)

    SET FOREIGN_KEY_CHECKS=0;
    

    2) 全球

    SET GLOBAL FOREIGN_KEY_CHECKS=0;
    
        5
  •  29
  •   Madhur Bhaiya    5 年前

    这个错误通常是因为 子表中不存在的字段 推荐/候选人 父表的字段。

    有时,在对现有表应用外键约束时,可能会出现此错误, . 其他一些答案建议从子表中完全删除数据,然后应用约束。但是,当子表中已经有工作/生产数据时,这不是一个选项。 在大多数情况下,我们需要更新子表中的数据 (而不是删除它们)。

    Left Join 查找子表中的所有行,该子表在父表中没有匹配的值。以下查询将有助于获取那些不匹配的行:

    SELECT child_table.* 
    FROM child_table 
    LEFT JOIN parent_table 
      ON parent_table.referenced_column = child_table.referencing_column 
    WHERE parent_table.referenced_column IS NULL
    

    现在,您通常可以执行以下一个(或多个)步骤来修复数据。

    1. null 也。
    2. 删除这些具有不匹配值的行。

    一旦数据被修复,我们就可以使用 ALTER TABLE 语法。

        6
  •  5
  •   Arbahud Rio Daroyni    6 年前

        7
  •  3
  •   Matt    6 年前

    即使父表中有我在子表中引用的所有值,我也会遇到这个问题。问题似乎是我不能向一个外键添加多个子引用。换句话说,如果有五行数据引用同一个外键,MySQL只允许我上传第一行,并给出错误1452。

    对我有效的是输入代码“SET GLOBAL FOREIGN\u KEY\u CHECKS=0”。之后,我关闭了MySQL,然后重新启动它,我能够上传我的所有数据没有错误。然后我键入“SET GLOBAL FOREIGN\u KEY\u CHECKS=1”将系统设置回正常状态,尽管我不完全确定FOREIGN\u KEY\u CHECKS的作用。希望这有帮助!

        8
  •  3
  •   Sagar Wankhede    6 年前

    在阅读了“法赞先生”和其他答案后,这帮了我的忙。

    我不知道WorkBench的情况,但是其他的答案可能会对你有所帮助。

        9
  •  2
  •   RamenChef    7 年前

    这可以通过先在父表中插入相应的记录,然后在子表的相应列中插入记录来解决。还要检查列的数据类型和大小。它应该与父表列相同,甚至引擎和排序规则也应该相同。

        10
  •  1
  •   Saket Choubey    9 年前

    你的 ORDRELINJE ORDER 使用外键约束的表 constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID) Ordre int NOT NULL, 表的列 订单

    现在发生的事情是,当你把新行插入 奥德雷林杰 表,根据fk约束 Ordrelinje_fk 它正在检查 订单 如果 OrdreID 是否存在,并且由于它与任何OrderId都不匹配,编译器正在抱怨外键冲突。这就是你得到这个错误的原因。

    外键是另一个表的主键,您可以在任何表中使用它来链接这两个表。此键由创建表时指定的外键约束绑定。对数据的任何操作都不能违反此约束。违反此约束可能会导致这样的错误。

        11
  •  1
  •   Ahmad    9 年前

    插入外键属性值时,首先验证属性类型,以及父关系中的主键属性值,如果父关系中的值匹配,则可以轻松插入/更新子属性值。

        12
  •  1
  •   mamal    7 年前

    您应该将数据从主表中的引用键添加到子表中的外键
    只需使用主键中可访问的数据

    description of data in foreign key

        13
  •  1
  •   UC57    6 年前

    检查父表中与子表匹配且主键必须与外键引用匹配的记录数。

        14
  •  1
  •   Dawood F.M Kaundama    5 年前

    我也有同样的问题。我在现有的表上创建关系,但是有不同的列值,这些列值被认为是相关的。例如,我有一张桌子 USERS 有一个专栏 USERID 有行 1,2,3,4,5 ORDERS 有一列 有行 1,2,3,4,5,6,7 ALTER TABLE ORDERS ADD CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS(USERID) ON DELETE SET NULL ON UPDATE CASCADE;

    它被拒绝,并显示以下消息:

    Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (DBNAME1.#sql-4c73_c0, CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS (USERID) ON DELETE SET NULL ON UPDATE CASCADE)

    我从ORDERS表中导出数据,然后删除其中的所有数据,再次运行命令,这次成功了,然后用相应的 用户ID 用户表中的。

        15
  •  0
  •   Harvester Haidar    7 年前

    您应该在每个表中至少插入一个raw(您希望外键指向的表),然后可以插入或更新外键的值

        16
  •  0
  •   Pytbyte    6 年前

    我把这个挤进去: 我的情况是试图创造一个类似的职位,力存在; 提交到数据库时出现错误。 我觉得这样比较好,因为那样对我来说更合乎逻辑。。

        17
  •  0
  •   Kishan Solanki    6 年前

    当你使用 外键 列的顺序应该相同 对于 插入 .

    (userid, password) 在里面 表1 然后从 表2 顺序应该相同 不像 (password,userid) 哪里 userid 外键 在里面 属于 表1 .

        18
  •  0
  •   THess user1031307    6 年前

    尝试从子表中删除所有数据,然后设置外键,然后在表中添加/插入数据,就可以了。

        19
  •  0
  •   Jeff Ogah    5 年前

    首先允许父表为NULL,并将默认值设置为NULL。接下来创建外键关系。之后,您可以相应地更新值以进行匹配

        20
  •  0
  •   Edoardo Vignati    5 年前

    在我的情况下,表格是完全一致的。

    不管怎样,我得到这个错误是因为我(偶然)在同一个字段上创建了多个FK约束。

    SELECT *
    FROM information_schema.table_constraints
    WHERE constraint_schema = 'my_db_name'
    

    我用以下查询删除了错误的:

    ALTER TABLE my_table
    DROP FOREIGN KEY wrong_fk_constraint; 
    

    您也可以在运行此查询时检查它:

    SHOW CREATE TABLE my_table;
    
        21
  •  0
  •   Pirate ammar    5 年前

    您的问题的答案是您必须在主键和副键中设置相同的值。 谢谢

        22
  •  0
  •   Stanley Aloh    5 年前

    我知道这个线程已经很长了,但是当我为分类表运行一个laravel seeding时,它创建了一些奇怪的id,它们是1,11,21,31,这导致了我的错误,因为我试图在另一个表中引用它,使用id,比如1,2,3。。。一整天,直到我手动检查数据库,

    因此,有时要查找数据库表以确保外来数据确实正确存在。

    干杯

        23
  •  0
  •   kuldeep chopra    5 年前

    我把空('')放在值为NULL的地方 现在,此“”值与父表的id不匹配

    否则,请从父表中删除数据,然后重试 enter image description here

    enter image description here enter image description here