如何引用 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)
);
我的数据库出现问题。情况如下:您有 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)
);