我知道主键值不能重复。然而,我想让游戏可以在多个平台上玩。例如 PC 和 PS4 上的《黑暗之魂》。如何修改关系设计,以便可以提供
SpelID
多个控制台而不重复?drop table if exists Spel;
drop table if exists Plattform;
drop table if exists Företag;
create table Företag (
FöretagID varchar(50) primary key,
Företag text,
Högk text
);
create table Plattform (
PlattformID integer primary key,
Plattform varchar (50)
);
create table Spel (
SpelID integer primary key,
namn varchar(50),
genre text,
år date,
Åldergräns char(2),
foreign key (SpelID) references Plattform (PlattformID),
foreign key (namn) references Företag (FöretagID)
);
insert into Företag (FöretagID, Företag, Högk)
values ('Zelda', 'Capcom', 'Japan'),
('Bloodborne', 'From', 'Japan');
insert into Plattform (PlattformID, Plattform)
values (0001, 'Nintendo'),
(0001, 'PS4'),
(0002, 'PS4'),
(0002, 'Nintendo');
insert into Spel (SpelID, namn, genre, år, Åldergräns)
values (0001, 'Zelda', 'Äventyr', '2015-10-12', 7),
(0002, 'Bloodborne', 'A-RPG', '2017-09-09', 18);
我尝试将它们添加到
Plattform
表中,但我知道主键只能有一个特定值。 (拼写=游戏)
首先您需要删除当前的约束:
-- https://stackoverflow.com/questions/29075413/change-primary-key-in-postgresql-table
-- DROP THE Primary key
-- ALTER TABLE plattform DROP CONSTRAINT plattform_pkey ;
-- not possible because of some forein keys, so drop other keys tooo:
ALTER TABLE plattform DROP CONSTRAINT plattform_pkey CASCADE;
警告:由于
CASCADE
,其他约束也被删除......您也必须重新创建这些约束! (更多信息请参见 DBFIDDLE)
然后您还需要将字段
SpellID
添加到表Plattform
:
-- add field SpellID
ALTER TABLE plattform ADD COLUMN spellID INTEGER;
之后您可以重新创建表的主键
Plattform
:
-- add Primary KEY
ALTER TABLE plattform ADD PRIMARY KEY(plattformID, spellID);
参见:DBFIDDLE
一款游戏可以在多个平台上发布,一个平台可以承载多款游戏。您的关系模型中的游戏和平台之间需要存在“多对多关系”。参见:
CREATE TABLE företag (
företagid integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY -- !
, företag text
, högk text
);
CREATE TABLE spel (
spelid integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY -- !
, företagid integer REFERENCES företag -- !
, spel text -- !
, genre text
, år date
, åldergräns integer -- ?!
);
CREATE TABLE plattform (
plattformid text PRIMARY KEY -- !! natural key?
, plattform text
-- more?
);
以上修改是小修复和其他建议。神奇之处来了(m:n 关系的实现):
CREATE TABLE spel_plattform (
spelid integer REFERENCES spel
, plattformid text REFERENCES plattform
-- more?
, PRIMARY KEY (spelid, plattformid)
);
样本数据:
INSERT INTO företag (företagid, företag, högk) VALUES
(1, 'Capcom', 'Japan')
, (2, 'From', 'Japan')
;
INSERT INTO spel (spelid, företagid, spel, genre, år, åldergräns) VALUES
(1, 1, 'Zelda' , 'Äventyr', '2015-10-12', 7)
, (2, 2, 'Bloodborne', 'A-RPG' , '2017-09-09', 18)
, (3, 2, 'Elden Ring', 'A-RPG' , '2022-01-01', 18)
;
INSERT INTO plattform (plattformid, plattform) VALUES
('NES', 'Nintendo Entertainment System')
, ('PS4', 'PlayStation 4')
;
INSERT INTO spel_plattform (spelid, plattformid) VALUES
(1, 'NES')
, (1, 'PS4')
, (2, 'NES')
, (2, 'PS4')
, (3, 'PS4')
;