1

同様のデータを持つ2つのテーブルusersとlead_contactsがあります。誰かが製品を購入すると、ユーザーになります。以下の 2 つの create ステートメントをどのように変更すればよいでしょうか。

  • ユーザーの作成時に、leads テーブルが first_name、last_name、company、および email を含む新しいエントリを受け取ること。
  • リード テーブル情報が変更されると、users テーブルの 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 デフォルト '',
    addressvarchar(100) NOT NULL デフォルト '',
    address_2varchar(100) NOT NULL デフォルト '',
    cityvarchar(50) NOT NULL デフォルト '',
    statevarchar(50) NOT NULL デフォルト'',
    countryvarchar(50) NOT NULL デフォルト '',
    postal_codevarchar(30) NOT NULL デフォルト '',
    phonevarchar(30) NOT NULL デフォルト '',
    faxvarchar(30) NOT NULL デフォルト '',
    ship_bill_sameenum('Y', ' N') NOT NULL デフォルト 'Y',
    notesテキスト NOT NULL,
    admin_notesテキスト NOT NULL,
    list_namevarchar(50) NOT NULL デフォルト '',
    lead_listint(11) unsigned 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 デフォルト '0',
    usernamevarchar(100) NOT NULL デフォルト '',
    passwordvarchar(100) NOT NULL デフォルト '',
    first_namevarchar(50) NOT NULL デフォルト ' ',
    last_namevarchar(50) NOT NULL デフォルト '',
    companyvarchar(100) NOT NULL デフォルト '',
    emailvarchar(100) NOT NULL デフォルト '',
    PRIMARY KEY ( userID),
    UNIQUE KEY username( username)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

4

1 に答える 1

3

外部キーの仕組みを誤解していると思います。

リードからユーザーへの参照は、リードの行がそれを参照する前に、その行がユーザーにすでに存在している必要があることを意味します。

SQL では、従属テーブルが必要に応じて親テーブルに行を自動的に作成するようにする方法はありません。

トリガーでこれを行うことができると思います。ただし、外部キー制約ではありません。また、親テーブルに入力する値はどこかから取得する必要があります。アプリケーションまたはトリガーの INSERT ステートメントで指定する必要があるか、ユーザー テーブルの各列に定義されているデフォルトを使用する必要があります。に一意の制約があることをusers.username考えると、トリガーからこれが可能になるとは思いません。


Re: コメントのフォローアップの質問:

いいえ、外部キーはあなたが説明していることを実行できません。leadsテーブル (外部キーを持つテーブル) の情報を変更する場合、テーブルにない値に列を変更しようとすると、外部キーができる唯一のことは変更を防止することです。 leads.user_idusers

子 ( ) テーブルの外部キーはleads、親 ( ) テーブルの内容を変更できませんusers

あなたの誤った理解の源が何なのか、私にはわかりません。どこかで読んだり、誰かがこのようなことをしているのを見たりしましたか?

于 2009-06-17T05:50:35.407 に答える