0

私は2つのテーブルを持っています -ACCOUNTSそしてUSERS

アカウント:

CREATE TABLE  `ACCOUNTS` (
  `pk` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` varchar(9) NOT NULL,
  `primary` varchar(1) NOT NULL DEFAULT 'N',
  `edit_on` bigint(10) unsigned DEFAULT NULL,
  `status` varchar(1) NOT NULL DEFAULT 'A',
  PRIMARY KEY (`pk`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1234567890 DEFAULT CHARSET=latin1

ユーザー:

CREATE TABLE  `USERS` (
  `user_id` bigint(9) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

に null 以外の値が含まれている場合、そのエントリは に含まれedit_onている既存のエントリの編集であることを意味します。pkedit_on

これが私がやりたいことです:

  1. すべてuser_idの inに対して、一致するinACCOUNTSがあるはずです。user_idUSERS
  2. edit_onである場合、 itが this (input) と等しいおよびthis (input)と等しい のnot nullエントリが存在する必要があります。そして、その(古い)エントリについては、に設定する必要があります。ACCOUNTSpkedit_onuser_iduser_idstatusE
  3. の場合、特定のprimary = 'Y'の他の行については、に設定する必要がありますACCOUNTSuser_idprimary'N'

さまざまなクエリ(使用など)で地獄をたくさん試した後ON DUPLICATE UPDATE、まだ解決策を見つけることができません。私はこれに丸2日間取り組んでいるので、助けてください。前もって感謝します。

編集

これまでに試したことに沿ったものを次に示します。

insert into ACCOUNTS
case
    when edit_on is null
        then
            select null, '222222222', 'N', null)
    else
        select null, '222222222', 'N', pk)
        from ACCOUNTS
            where '222222222' = user_id and '2147483680' = pk
        select pk, '222222222', 'N', pk)
        on duplicate key update status='E'
end

primary私はまだ何もしていませんが、これは解決ではありません:D

4

1 に答える 1

1

2つの制約が必要なようです。

1)FOREIGN KEY制約。これにより、にuser_id挿入されたものがにACCOUNTS存在することが保証されますUSERS

ALTER TABLE ACCOUNTS
ADD FOREIGN KEY
accounts_user_user_id (user_id)
REFERENCES USERS (user_id)

2)自己参照のFOREIGN KEY制約。これにより、に挿入された値がinedit_onからの有効な値であることが保証されます。pkACCOUNTS

ALTER TABLE ACCOUNTS
ADD FOREIGN KEY
accounts_accounts_edit_on (edit_on)
REFERENCES ACCOUNTS (pk)

ON UPDATEオプションで、必要なアクションとON DELETE参照されるキーを定義できます。FOREIGN KEY制約について詳しくは、こちらをご覧ください。

user_id両方のテーブルが同じタイプであり、両方のテーブルが。であることを確認する必要がありますInnoDB

于 2012-10-12T18:23:49.960 に答える