我用Javascript编写了一个应用程序,它通过连接到MariaDB服务器将数据插入到两个表中。
第一次运行应用程序时,这些表中的行之间应该有1:1的对应关系。
一个表存储(模拟)属性数据,另一个表存储价格数据。每个属性应该有一个价格。以后价格可能会更改,因此价格可能有多个条目,但在应用程序首次运行时不会发生这种情况。这些条目也不能违反唯一索引-但它们确实违反了唯一索引。
也许我在MariaDB中配置错了什么?下面是生成表的代码。
drop table if exists property_price;
drop table if exists property;
create table property
(
unique_id bigint unsigned not null auto_increment primary key,
web_id bigint unsigned not null,
url varchar(256),
street_address varchar(256),
address_country varchar(64),
property_type varchar(64),
num_bedrooms int,
num_bathrooms int,
created_datetime datetime not null,
modified_datetime datetime not null
);
create table property_price
(
property_unique_id bigint unsigned not null,
price_value decimal(19,2) not null,
price_currency varchar(64) not null,
price_qualifier varchar(64),
added_reduced_ind varchar(64),
added_reduced_date date,
created_datetime datetime not null
);
alter table property_price
add constraint fk_property_unique_id foreign key(property_unique_id)
references property(unique_id);
alter table property
add constraint ui_property_web_id
unique (web_id);
alter table property
add constraint ui_url
unique (url);
alter table property_price
add constraint ui_property_price
unique (property_unique_id, price_value, price_currency, price_qualifier, added_reduced_ind, added_reduced_date);
下面是DBeaver的屏幕截图,显示select语句返回两个相同的行。
我不明白为什么这个唯一约束会被违反。这个约束有时候确实有效,因为如果我再次运行我的应用程序,它会失败,因为它试图插入一个已经存在于DB中的重复行。(与下面所示的不同)
有人能给我指出正确的方向,告诉我如何调试它吗?
1条答案
按热度按时间deyfvvtc1#
MariaDB允许在构成唯一约束一部分的列上有多个值。
我的解决方案是将检查重复行的逻辑放在应用程序中,而不是放在数据库端,这实际上意味着没有使用唯一约束。