mysql 为什么MariaDB数据库中有两行违反了唯一约束?

fcg9iug3  于 2023-02-21  发布在  Mysql
关注(0)|答案(1)|浏览(180)

我用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中的重复行。(与下面所示的不同)
有人能给我指出正确的方向,告诉我如何调试它吗?

deyfvvtc

deyfvvtc1#

MariaDB允许在构成唯一约束一部分的列上有多个值。
我的解决方案是将检查重复行的逻辑放在应用程序中,而不是放在数据库端,这实际上意味着没有使用唯一约束。

相关问题