MariaDB动态连接引用中两个字段,是否可能?

daolsyd0  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(118)

我们可以在MariaDB中提供类似的内容吗?

ALTER TABLE `files` ADD
CONSTRAINT `fk_persons_cover`
    FOREIGN KEY (`foreign_key`, `model`)
    REFERENCES `persons` (`uuid`, "persons_cover")
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

files.uuid=persons.uuidfiles.model="persons_cover"时,我需要从文件人员表引用
现在用这个代码MariaDB说:


# 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"persons_cover")

    ON DELETE NO ACTION
    ON UPDATE NO ACTION' at line 4

有没有解决的办法?
编辑:
我知道可以使用filelable超/接口表像this solution
或者在文件表中使用一些自动生成的字段,如this solution
但我认为它们不是好解决办法。
在第一个解决方案中,我们找不到文件1(行1)与什么关联?或者找不到人员1(pk = 1的人员行)文件的列表
在第二个解决方案中,我们应该为每个新关联添加可为空的外键字段!

fkvaft9z

fkvaft9z1#

如果PERSONS表有一个包含uuid和persons_cover(例如)的复合主键(或唯一键),则该方法应该有效

create table persons( 
  uuid varchar( 100 ) 
, persons_cover varchar( 100 ) 
, constraint persons_pkey primary key ( uuid, persons_cover )
) ;

create table files (
  uuid varchar( 100 )
, model varchar( 100 )
) ;

alter table files
add constraint fk_persons_cover
foreign key( uuid, model ) references persons( uuid, persons_cover ) ;

如果在PERSONS表格中,只有UUID数据栏是主索引键数据栏,复合外部索引键可能无法运作。不过,在此情况下,您可以新增复合UNIQUE索引键至PERSONS表格(uuid和person_cover)。如果储存在表格中的值允许,您可以新增复合外部索引键至FILES。

create table persons2( 
  uuid varchar( 100 ) 
, persons_cover varchar( 100 ) 
, constraint persons_pkey primary key ( uuid )  -- PK: only one column
) ;

-- does not work 
alter table files
add constraint fk_persons_cover2
foreign key( uuid, model ) references persons2( uuid, persons_cover ) ;

-- error
-- Failed to add the foreign key constraint. Missing index for constraint 'fk_persons_cover2' in the referenced table 'persons2'

-- add a composite unique key
alter table persons2 
add constraint upc_unique unique( uuid, persons_cover ) ;

-- no problem
alter table files
add constraint fk_persons_cover2
foreign key( uuid, model ) references persons2( uuid, persons_cover ) 
on delete no action
on update no action 
;

小提琴。

tjrkku2a

tjrkku2a2#

REFERENCES `persons` (`uuid`, "persons_cover")

不行,不能在此行中输入字符串文字。只能指定persons表中存在的列名。通常,这些列名是该表的主键列。
外键约束适用于表的 * 所有 * 行。没有只适用于某些行的条件外键。
我知道你认为你链接到的变通方案不是好的解决方案,但这应该是一个线索,多态关联不是一个好的设计。
我在numerous of my answers on Stack Overflow和我的书SQL Antipatterns, Volume 1: Avoiding the Pitfalls of Database Programming的一章中写了更多关于多态关联的缺点。

相关问题