mysql - 如何使元组在 SQL 表中唯一?

标签 mysql sql constraints

我的问题很简单,但我无法用语言表达。 我有一个用户表,每个用户都有 ID。

我想做一个友情表,但是我不想能够有重复的记录。意思不是这个:

id_user1 | id_user2
---------|----------
   2     |    3
   3     |    2

我够清楚吗?

目前我有这个用于我的表创建:

CREATE TABLE User(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    surname VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE Friends(
    id_user1 INT NOT NULL,
    id_user2 INT NOT NULL,
    PRIMARY KEY(id_user1, id_user2),
    FOREIGN KEY (id_user1) REFERENCES User(id),
    FOREIGN KEY (id_user2) REFERENCES User(id),
);

[编辑 1:] 也许最好的做法是将每条记录保存两次?两种方式?

最佳答案

您可以在触发器中检查重复项,但最好确保例如具有较低值的 id 转到 id_user1,另一个转到 id_user2。您可以在您的应用程序中或在触发器的帮助下执行此操作,例如您在表上创建主键约束并:

DROP TRIGGER IF EXISTS yourtable_bi;

delimiter //

CREATE TRIGGER yourtable_bi
before insert on yourtable 
for each row 
begin 
declare x int; 
if (new.id_user1>new.id_user2) 
then 
set x:=NEW.id_user1; 
set NEW.id_user1:=NEW.id_user2; 
set NEW.id_user2:=x; 
end if; 
end//
delimiter ;

所以,然后之后

insert into yourtable values (1,2);

如果你尝试

insert into yourtable values (2,1);

它会尝试插入相同的记录,但会因为主键约束而失败。

如果您的 table 上允许,您也可以这样做以进行更新。

关于mysql - 如何使元组在 SQL 表中唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40743621/

相关文章:

mysql - .Net Core EF MySQL 在将外键列更改为可为空时出现问题

mysql - 使用 VARBINARY(max) 存储图像时出现 SQL 错误

mysql - 创建数据库的终端功能。 Bash 到 Mysql?

mysql - 从 VARCHAR 转换为 INT - MySQL

Mysql 左连接与连接?

ios - 如何向 Collection View 添加标签

mysql - 使用 java 和 junit 测试测试 mysql etl

Mysql查询以选择前一分钟的记录

sql - 如何在Postgres中实现列值变化约束

iOS - 设置两个 subview 约束的更好方法