gpt4 book ai didi

mysql - 如何避免在mysql的字段中输入互斥数据

转载 作者:可可西里 更新时间:2023-11-01 08:49:37 25 4
gpt4 key购买 nike

我正在尝试限制字段中的输入错误。我正在构建的站点包含有关汽车的数据。

一辆车可以有多个设备(空调、ABS、真皮座椅等),我想以某种方式防止数据输入出错,或者至少尽量减少错误。

第一种错误情况是为 2 个或多个互斥设备输入数据。例如汽车不能有手动空调和自动空调和自动空调双区。汽车中只能存在其中一个。

第二种错误情况是在没有先决条件的情况下为设备输入数据。例如,在没有所需 ABS 的情况下输入紧急制动辅助 (BA)。汽车可以有ABS没有 BA,但 BA 将仅存在于具有 ABS 的汽车中。

输入数据的表格很简单。每辆车 ( version_id ) 都有多个 equipments(trims) 或 trim_ids。 Version_id 和 trim_id 分别是表版本和修剪的 FK。所以不存在的trim_id或version_id的错误已经在表versiontrim中处理了。

Table versiontrim(我想最小化数据错误的地方)

version_id    trim_id

表格装饰:

trim_id    trim    trimtype

表格版本

version_id    model_id    version    active    bodytype    places    motor_id    etc...

感谢任何帮助。

最佳答案

For each selected trim,
Retrieve the set of mutually exclusive trims.
Check if any of those are also selected.
Retrieve the set of prerequisite trims.
Check that each of those are also selected.
create table prerequisites (
trim_id1 int not null references trims ( trim_id ),
trim_id2 int not null references trims ( trim_id ),
primary key ( trim_id1, trim_id2 )
);

create table exclusives (
exclusive_group int not null,
trim_id int not null references trims ( trim_id ),
primary key ( exclusive_group, trim_id ),
index ( trim_id, exclusive_group )
);

-- Retrieve all prerequisites of selected trims
select p.trim_id1, p.trim_id2
from versions v
inner join versiontrim vt on vt.version_id = v.version_id
inner join prerequisites p on p.trim_id1 = vt.trim_id
where v.version_id = ?;

-- Retrieve all mutually exclusive trims of selected trims
select vt.trim_id as trim_id1, e2.trim_id as trim_id2
from versions v
inner join versiontrim vt on vt.version_id = v.version_id
inner join exclusives e1 on e1.trim_id = vt.trim_id
inner join exclusives e2 on e2.exclusive_group = e1.exclusive_group
where e1.trim_id <> e2.trim_id
and v.version_id = ?;

您可以更进一步,返回冲突:

-- Retrieve any missing prerequisites of the selected trims
select p.trim_id1, p.trim_id2
from versions v
inner join versiontrim vt1 on vt1.version_id = v.version_id
inner join prerequisites p on p.trim_id1 = vt1.trim_id
left join versiontrim vt2
on vt2.version_id = v.version_id
and vt2.trim_id = p.trim_id2
where vt2.version_id is null
and v.version_id = ?;

-- Retrieve any selected mutually exclusive trims
select vt.trim_id as trim_id1, e2.trim_id as trim_id2
from versions v
inner join versiontrim vt on vt.version_id = v.version_id
inner join exclusives e1 on e1.trim_id = vt.trim_id
inner join exclusives e2 on e2.exclusive_group = e1.exclusive_group
inner join versiontrim vt2 on vt2.version_id = v.version_id
where e1.trim_id <> e2.trim_id
and vt2.trim_id = e2.trim_id
and v.version_id = ?;

关于mysql - 如何避免在mysql的字段中输入互斥数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17384820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com