如何将外键添加到两个Innob表中,以便它们相互自动更新?

时间:2009-06-17 05:36:28

标签: mysql database-design foreign-keys innodb

我有两个表用户和lead_contacts,它们具有相似的数据。当有人购买产品时,他们就会成为用户。我应该如何修改下面的两个创建标记:

  • 引导表收到新的 创建用户时,使用first_name,last_name,company和email输入。
  • 更新了users表中的first_name,last_name,company和email 当潜在客户表信息被更改时自动

    创建表lead_contacts
      contact_id int(11)NOT NULL auto_increment,
    user_id int(11)unsigned NOT NULL默认值'0',
    email varchar(100)NOT NULL默认'',
    company varchar(50)NOT NULL默认'',
    first_name varchar(50)NOT NULL默认'',
    last_name varchar(50)NOT NULL默认'',
    address varchar(100)NOT NULL默认'',
    address_2 varchar(100)NOT NULL默认'',
    city varchar(50)NOT NULL默认'',
    state varchar(50)NOT NULL默认'',
    country varchar(50)NOT NULL默认'',
    postal_code varchar(30)NOT NULL默认'',
    phone varchar(30)NOT NULL默认'',
    fax varchar(30)NOT NULL默认'',
    ship_bill_same枚举('Y','N')NOT NULL默认为'Y',
    notes文本NOT NULL,
    admin_notes文本NOT NULL,
    list_name varchar(50)NOT NULL默认'',
    lead_list int(11)unsigned NOT NULL默认值'0',
    is_master_list枚举('N','Y')NOT NULL默认为'N',
    active_work枚举('Y','N')NOT NULL默认为'Y',
    parentID int(11)unsigned NOT NULL默认值'0',
    PRIMARY KEY(contact_id),
    KEY user_iduser_id),
    KEY lead_listlead_list),
    KEY is_master_listis_master_list),
    KEY active_workactive_work),
    KEY parentIDparentID
    )ENGINE = InnoDB DEFAULT CHARSET = latin1 PACK_KEYS = 1;

    创建表users
    userID int(11)NOT NULL auto_increment,
    access_level int(11)NOT NULL默认为'0',
    username varchar(100)NOT NULL默认'',
    password varchar(100)NOT NULL默认'',
    first_name varchar(50)NOT NULL默认'',
    last_name varchar(50)NOT NULL默认'',
    company varchar(100)NOT NULL默认'',
    email varchar(100)NOT NULL默认'',
    PRIMARY KEY(userID),
    独特的钥匙usernameusername
    )ENGINE = InnoDB DEFAULT CHARSET = latin1;

1 个答案:

答案 0 :(得分:3)

我认为你误解了外键是如何工作的。

从潜在客户到用户的引用意味着在潜在客户中的行可以引用用户之前,用户必须已存在行。

SQL中没有办法让依赖表根据需要在其父表中自动创建一行。

我猜你可以用触发器做到这一点。但不是外键限制。此外,填充到父表中的值必须来自某个地方。您需要在应用程序或触发器的INSERT语句中指定它们,或者使用为users表中的每个列定义的默认值。鉴于你对users.username有一个独特的约束,我认为这不可能来自触发器。


Re:您在评论中的后续问题:

不,外键不能做你所描述的。当您修改leads表(带有外键的表)中的信息时,如果您尝试更改{{1},则外键可以执行的事件会阻止修改}列到leads.user_id表中找不到的值。

子(users)表中的外键不能更改父(leads)表中的任何内容。

我不确定你错误理解的根源是什么。你在某个地方看过它还是看到有人做过这样的事情?