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

标签 mysql database-design foreign-keys innodb

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

  • leads 表收到一个新的 创建用户时,包含名字、姓氏、公司和电子邮件的条目。
  • 用户表中的名字、姓氏、公司和电子邮件已更新 当潜在客户表信息更改时自动

    创建表 lead_contacts (
    contact_id int(11) NOT NULL auto_increment,
    user_id int(11) unsigned NOT NULL default '0',
    email varchar(100) NOT NULL default '',
    公司 varchar(50) NOT NULL default '',
    first_name varchar(50) NOT NULL 默认 '',
    last_name varchar(50) NOT NULL 默认 '',
    地址 varchar(100) NOT NULL default '',
    address_2 varchar(100) NOT NULL default '',
    城市 varchar(50) NOT NULL default '',
    state varchar(50) NOT NULL 默认 '',
    国家 varchar(50) NOT NULL default '',
    postal_code varchar(30) NOT NULL 默认 '',
    phone varchar(30) NOT NULL default '',
    fax varchar(30) NOT NULL default '',
    ship_bill_same enum('Y', 'N') NOT NULL 默认 'Y',
    notes text NOT NULL,
    admin_notes 文本不为空,
    list_name varchar(50) NOT NULL 默认 '',
    lead_list int(11) unsigned NOT NULL default '0',
    is_master_list enum('N', 'Y') NOT NULL 默认 'N',
    active_work enum('Y', 'N') NOT NULL 默认 'Y',
    parentID int(11) unsigned NOT NULL default '0',
    主键(contact_id),
    KEY user_id (user_id),
    KEY lead_list (lead_list),
    KEY is_master_list (is_master_list),
    KEY active_work (active_work),
    KEY parentID (parentID)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PACK_KEYS=1;

    创建表用户(
    userID int(11) NOT NULL auto_increment,
    access_level int(11) NOT NULL 默认 '0',
    用户名 varchar(100) NOT NULL default '',
    密码 varchar(100) NOT NULL default '',
    first_name varchar(50) NOT NULL 默认 '',
    last_name varchar(50) NOT NULL 默认 '',
    公司 varchar(100) NOT NULL default '',
    email varchar(100) NOT NULL default '',
    主键(用户ID),
    唯一键 用户名 (用户名)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

最佳答案

我认为您误解了外键的工作原理。

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

SQL 中没有办法让从属表按需自动在其父表中创建一行。

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


回复:您在评论中的后续问题:

不,外键不能执行您所描述的操作。当您修改 leads 表(带有外键的表)中的信息时,外键唯一可以做的事情就是在您尝试更改 leads.user_id 列设置为在 users 表中找不到的值。

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

我不确定您错误理解的根源是什么。您是否在某处读过或看到有人这样做过?

关于mysql - 如何将外键添加到两个 Innodb 表,以便它们自动相互更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1005276/

相关文章:

mysql - 你能在不知道 MySQL 模式的情况下复制一行吗?

mysql - 数据库反规范化机会

mysql - Django 模型访问

mysql - 外键和基本关系表

mysql - 关系数据库中的最佳表设置

mysql - MySQL 中的复制主从在从属上有更多表

database-design - 用于多重身份验证、Facebook Connect、Twitter、OpenID 等的数据库架构

oracle - 使用 Oracle Sql Developer 生成 DDL 以包含外键

php - 使用php 5秒将数据保存到MySQL

mysql - 如何将关系数据库用作基于文档的数据库?