【发布时间】:2017-08-31 15:34:52
【问题描述】:
给定下表:
CREATE TABLE IF NOT EXISTS devices_used_by_resource (
id INT NOT NULL,
sourcesId INT NOT NULL,
name VARCHAR(45) NOT NULL,
PRIMARY KEY (id, sourcesId),
INDEX sourcesIdInx (sourcesId ASC),
UNIQUE INDEX nameSourceUniqueInx (name ASC, sourcesId ASC),
CONSTRAINT existingSourcesId
FOREIGN KEY (sourcesId)
REFERENCES sources (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
我希望以下查询:
INSERT INTO devices_used_by_resource(id,sourcesId,name) VALUES(123,321,'the name');
回复为:
- 如果 123/321 的 id/sourcesId 不存在,则插入记录。
- 如果 123/321 的 id/sourcesId 确实存在并且 name 等于“名称”,则忽略。
- 如果 123/321 的 id/sourcesId 确实存在并且名称不等于“名称”,则抛出异常。
sourcesId 之前已被验证为存在。
这可能吗?如果可以,怎么做?
PS。是否需要索引 sourcesIdInx,如果需要,为什么?
【问题讨论】:
-
基于唯一约束,您的第二个要求将失败并出现数据库异常。另外,我认为您的逻辑可能会颠倒过来,要求使用唯一的名称。我认为你应该在 2 和 3 之间切换忽略和抛出。
-
@RossBush 2 不应该是一个错误,因为没有任何改变。 3 应该是一个错误,因为发生了一些变化。我的意图是然后在另一个包含
id.devices_used_by_resources的表中执行插入,并需要确保它存在并且没有被更改.. -
我误读了您的意图。但是,目前尚不清楚。为什么不将 id 字段添加到 nameSourceUniqueInx 唯一约束。这样可以保证表中的所有 id/sourceId/name 组合都是唯一的。
-
@RossBush 因为无论 id 值如何,名称对于给定的 sourcesId 都必须是唯一的。
标签: mysql sql exception mariadb