Vreau să creez tabele în SQL Server 2008, dar nu știu cum să creez cheia primară compozită. Cum pot realiza acest lucru?
create table my_table (
column_a integer not null,
column_b integer not null,
column_c varchar(50),
primary key (column_a, column_b)
);
- Care este diferența dintre utilizarea Cheia primară și CONSTRAINT ca în exemplul lui @matthew-abbott? – > .
- Se creează o constrângere cu nume care poate fi ștearsă/actualizată după nume – > .
- Nu este chiar adevărat. Ambele creează „constrângeri numite”. Doar că, în cazul primei, nu controlați denumirea. Dar, odată creată, puteți căuta numele care a fost folosit și puteți șterge/actualiza după nume… – > .
29
CREATE TABLE UserGroup
(
[User_Id] INT NOT NULL,
[Group_Id] INT NOT NULL
CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([User_Id], [Group_Id])
)
- 37
- +1 – Da, denumiți constrângerile oamenilor, altfel Sql Server face lucruri urâte, cum ar fi să le numească PK_UserGrou_5DEAEAF5 în BD-ul unei versiuni și PK_UserGrou_3214EC0777F66C69 în alta. Acest lucru este o bătaie de cap dacă trebuie să actualizați sau să renunțați la PK, deoarece trebuie să obțineți mai întâi numele din baza de date și apoi să utilizați SQL dinamic (sau să construiți mai întâi comanda în cod). De asemenea, este urât. – > .
- Există vreun motiv pentru care nu aș vrea ca PK-ul meu să fie grupat? – > .
- @4AM Acest lucru ar putea răspunde la întrebarea dvs.: link – > .
Prin intermediul Enterprise Manager (SSMS)…
- Faceți clic dreapta pe tabelul pe care doriți să creați cheia compozită și selectați Design.
- Evidențiați coloanele pe care doriți să le formați ca o cheie compozită
- Faceți clic dreapta pe aceste coloane și Setați cheia primară
Pentru a vedea SQL, puteți apoi să faceți clic dreapta pe Table
> Script Table As
> Create To
- Vă mulțumim. Aceasta este cea mai sigură/ușoară metodă fără a îmi strica sintaxa SQL – > .
- Acest lucru face mai ușor pentru cei care doresc o rezolvare rapidă prin interfața de proiectare / ghidare. Vă mulțumim pentru ajutor. – > .
Știu că am ajuns târziu la această petrecere, dar pentru un tabel existent, încercați:
ALTER table TABLE_NAME
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.)
Pentru MSSQL Server 2012
CREATE TABLE usrgroup(
usr_id int FOREIGN KEY REFERENCES users(id),
grp_id int FOREIGN KEY REFERENCES groups(id),
PRIMARY KEY (usr_id, grp_id)
)
UPDATE
Ar trebui să adaug !
Dacă doriți să adăugați chei străine / primare de modificare, în primul rând trebuie să creați cheile cu constrângeri sau nu puteți face modificări. Așa cum se arată mai jos:
CREATE TABLE usrgroup(
usr_id int,
grp_id int,
CONSTRAINT FK_usrgroup_usrid FOREIGN KEY (usr_id) REFERENCES users(id),
CONSTRAINT FK_usrgroup_groupid FOREIGN KEY (grp_id) REFERENCES groups(id),
CONSTRAINT PK_usrgroup PRIMARY KEY (usr_id,grp_id)
)
De fapt, ultima modalitate este mai sănătoasă și serială. Vă puteți uita la numele constrângerilor FK/PK. (dbo.dbname > Keys > …) dar dacă nu utilizați o constrângere, MSSQL creează automat nume FK/PK aleatorii. Va trebui să vă uitați la fiecare modificare (alter table) de care aveți nevoie.
Vă recomand să vă stabiliți un standard; constrângerea ar trebui să fie definită în conformitate cu standardul dumneavoastră. Nu va trebui să memorați și nu va trebui să vă gândiți prea mult timp. Pe scurt, lucrați mai repede.
- acest lucru nu creează PK, ci doar FK, nu-i așa? – > .
- @batmaci; Nu, Este atât FK, cât și grupul dublu FK la PK. Această utilizare este mai sănătoasă. Eu o sfătuiesc. Când nu creați PK, puteți folosi și voi. – > .
Mai întâi creați baza de date și tabelul, adăugând manual coloanele. În care coloană să fie cheia primară. Ar trebui să faceți clic dreapta pe această coloană și să setați cheia primară și să setați valoarea inițială a cheii primare.
Pentru a crea o cheie unică compozită în tabel
ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]);
CREATE TABLE UserGroup
(
[User_Id] INT Foreign Key,
[Group_Id] INT foreign key,
PRIMARY KEY ([User_Id], [Group_Id])
)
- adăugați și o descriere. > .
54