如何引用 postgres 中的非唯一列?

How to reference a non-unique column in postgres?

我的数据库出现问题。情况如下:您有 2 个以上的玩家会话,每个玩家会话都有相同的回合数。这意味着玩家 1 依次玩了一些东西,玩家 2 玩了其他东西,但它被归类为第 1 回合。问题是我不能让 turn_no 在我的数据库中是唯一的,因为我刚才提到的原因。我得到的错误是因为我没有 table 'int_turn' 的唯一约束。但是如果我让它成为唯一的,我在保存时就违反了唯一的约束。我以为我被允许拥有非唯一的外键。

CREATE TABLE IF NOT EXISTS int_turn(
    playersession_id INT REFERENCES int_playersession(playersession_id) ON DELETE CASCADE,
    turn_no INT NOT NULL ,
    time_spent INT NOT NULL,
    time_played TIMESTAMP NOT NULL,
    CONSTRAINT turn_pkey PRIMARY KEY (playersession_id,turn_no)
);

CREATE TABLE IF NOT EXISTS int_move(
    playersession_id INT REFERENCES int_playersession(playersession_id) ON DELETE CASCADE,
    turn_no INT REFERENCES int_turn(turn_no),
    move_no INT NOT NULL,
    x INT,
    y INT,
    tile_id INT REFERENCES int_tile,
    CONSTRAINT move_pk PRIMARY KEY (playersession_id,move_no, turn_no)
);

另外我想如果这个问题可以解决,我也会遇到同样的问题,但是 move_no,每回合都有 move_no,这是一个更大的问题。

这是我的 ERD,但 turn_no 是独一无二的,仅供您查看。

你不知道 - 尝试引用 non-unique 值显然没有意义。

不过,你的直觉是对的,你只需要引用主键即可。因此,您将第二个 table 更改为:

CREATE TABLE IF NOT EXISTS int_move(
    playersession_id INT NOT NULL,
    turn_no INT REFERENCES NOT NULL,
    move_no INT NOT NULL,
    x INT,
    y INT,
    tile_id INT REFERENCES int_tile,
    CONSTRAINT valid_player_turn FOREIGN KEY (playersession_id, turn_no) REFERENCES int_turn,
    CONSTRAINT move_pk PRIMARY KEY (playersession_id,move_no, turn_no)
);