1

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

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

    CREATE TABLE lead_contacts(
    contact_idint(11) NOT NULL auto_increment,
    user_idint(11) unsigned NOT NULL default '0',
    emailvarchar(100) NOT NULL default '',
    companyvarchar(50) NOT NULL default '',
    first_namevarchar(50) NOT NULL default '',
    last_namevarchar(50) NOT NULL default '',
    addressvarchar(100) NOT NULL default '',
    address_2varchar(100) NOT NULL default '',
    cityvarchar(50) NOT NULL default '',
    statevarchar(50) NOT NULL default '',
    countryvarchar(50) NOT NULL default '',
    postal_codevarchar(30) NOT NULL default '',
    phonevarchar(30) NOT NULL default '',
    faxvarchar(30) NOT NULL default '',
    ship_bill_sameenum('Y', ' N') NOT NULL 默认 'Y',
    notestext NOT NULL,
    admin_notestext NOT NULL,
    list_namevarchar(50) NOT NULL default '',
    lead_listint(11) 无符号 NOT NULL 默认 '0',
    is_master_listenum('N', 'Y') NOT NULL 默认 'N',
    active_workenum('Y', 'N') NOT NULL 默认 'Y',
    parentIDint(11) unsigned NOT NULL default '0',
    PRIMARY KEY ( 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;

    CREATE TABLE users(
    userIDint(11) NOT NULL auto_increment,
    access_levelint(11) NOT NULL default '0',
    usernamevarchar(100) NOT NULL default '',
    passwordvarchar(100) NOT NULL default '',
    first_namevarchar(50) NOT NULL default ' ',
    last_namevarchar(50) NOT NULL default '',
    companyvarchar(100) NOT NULL default '',
    emailvarchar(100) NOT NULL default '',
    PRIMARY KEY ( userID),
    UNIQUE KEY username( username)
    ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

4

1 回答 1

3

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

从潜在客户到用户的引用意味着用户中必须已经存在一行,然后潜在客户中的一行才能引用它。

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

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


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

不,外键不能做你所描述的。当您修改leads表(具有外键的表)中的信息时,如果您尝试将列更改为表中未找到的值,外键唯一能做的就是阻止修改。 leads.user_idusers

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

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

于 2009-06-17T05:50:35.407 回答