我有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
USERS:
CREATE TABLE `USERS` (
`user_id` bigint(9) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
如果edit_on
包含非空值,则表示该条目是对现有条目的修改,其pk
包含在edit_on
中。
这就是我想要做的事情:
user_id
中的每个ACCOUNTS
,user_id
中应该匹配USERS
。edit_on
为not null
,则ACCOUNTS
中应存在一个条目pk
等于此(输入)edit_on
和user_id
等于此(输入)user_id
。对于该(旧)条目,status
应设置为E
。primary = 'Y'
,则对于ACCOUNTS
中具有特定user_id
的其他行,primary
应设置为'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
PLUS 的任何事情。这个不是解决方案:D
答案 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
的任何值都是ACCOUNTS
中ALTER TABLE ACCOUNTS
ADD FOREIGN KEY
accounts_accounts_edit_on (edit_on)
REFERENCES ACCOUNTS (pk)
的有效值。
ON UPDATE
或者,您可以定义所需操作ON DELETE
和FOREIGN KEY
的操作。您可以详细了解user_id
约束here。
您需要确保两个表上的InnoDB
属于同一类型,并且两个表都是{{1}}。