如何在单个查询中执行复杂的插入,选择,更新?

时间:2012-10-12 18:16:53

标签: mysql sql

我有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

USERS:

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

如果edit_on包含非空值,则表示该条目是对现有条目的修改,其pk包含在edit_on中。

这就是我想要做的事情:

  1. 对于user_id中的每个ACCOUNTSuser_id中应该匹配USERS
  2. 如果edit_onnot null,则ACCOUNTS中应存在一个条目pk等于此(输入)edit_onuser_id等于此(输入)user_id。对于该(旧)条目,status应设置为E
  3. 如果primary = 'Y',则对于ACCOUNTS中具有特定user_id的其他行,primary应设置为'N'
  4. 在使用不同的查询(使用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 PLUS 的任何事情。这个不是解决方案:D

1 个答案:

答案 0 :(得分:1)

听起来你需要两个限制:

1)FOREIGN KEY约束。这将确保user_id中存在ACCOUNTS中插入USERS的任何ALTER TABLE ACCOUNTS ADD FOREIGN KEY accounts_user_user_id (user_id) REFERENCES USERS (user_id)

FOREIGN KEY

2)自引用edit_on约束。这将确保插入pk的任何值都是ACCOUNTSALTER TABLE ACCOUNTS ADD FOREIGN KEY accounts_accounts_edit_on (edit_on) REFERENCES ACCOUNTS (pk) 的有效值。

ON UPDATE

或者,您可以定义所需操作ON DELETEFOREIGN KEY的操作。您可以详细了解user_id约束here

您需要确保两个表上的InnoDB属于同一类型,并且两个表都是{{1}}。