0

我有 2 张桌子 -ACCOUNTSUSERS

帐户:

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

如果edit_on包含非空值,则表示该条目是对现有条目的编辑,其pk包含在edit_on.

这是我想要做的:

  1. 对于每一个user_idin ACCOUNTS,都应该有一个匹配user_id的 in USERS
  2. 如果edit_onnot null,则应该存在一个等于 this (input)和等于 this (input)ACCOUNTS的条目。对于那个(旧)条目,应该设置为.pkedit_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

听起来您需要两个约束:

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 回答