sql - 避免在SQL的自反关系中重复记录

标签 sql sqlite

在SQLite3中,我有一个代表自反关系的表。这就是我创建它的方式:

CREATE TABLE relationships (
    id_relationship INT,
    id_person_1 INT NOT NULL,
    id_person_2 INT NOT NULL,
    description VARCHAR2(300),

    PRIMARY KEY(id_relationship),
    FOREIGN KEY(id_person_1) REFERENCES people(id_person),
    FOREIGN KEY(id_person_2) REFERENCES people(id_person),
    CONSTRAINT relationship_not_repeated UNIQUE(id_person_1, id_person_2),
    CONSTRAINT ids_not_equal CHECK(id_person_1 != id_person_2)
);


我想添加一个约束以避免重复,因为我有两个相同类型的外键,并且可能会发生以下情况:

ID_RELATIONSHIP  ID_PERSON_1      ID_PERSON_2    DESCRIPTION
---------------  ---------------  -------------  ---------------
1                114              115            family
2                115              114            family

最佳答案

最简单的方法是要求该id_person_1 < id_person_2。您可以通过在create table语句中添加检查约束来做到这一点:

check (id_person_1 < id_person_2);


请注意,如果执行此操作,则可能无法正常运行某些插入语句。您可以通过添加insert触发器来解决此问题,该触发器将交换两个人的值,因此较小者优先。

关于sql - 避免在SQL的自反关系中重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24600010/

相关文章:

php - MySQL 5.5.32 上的连接问题

java - 如何将字母代码转换为数字?

SQL如何计算一组的相对值?

android - 为什么我的数据库使应用程序强制关闭但在我清除数据后工作正常?

安卓:sqlite:游标:getColumnIndex

sql - 如何根据字段获取行相对于总行数的排名?

MySQL - 当嵌套选择使用该表时如何从表中删除?

android - 如果写入后不久断电,数据不会写入 sqlite 数据库

iphone - 添加要存储的新对象时核心数据关系丢失

sqlite - Xamarin Sqlite Insert 不返回最后一个主键 ID