Tambahkan kunci utama ke tabel yang ada

194

Saya memiliki tabel yang sudah ada bernama Persion. Dalam tabel ini saya memiliki 5 kolom:

  • persionId
  • Pname
  • PMid
  • Deskripsi
  • Pamt

Ketika saya membuat tabel ini, saya menetapkan PersionIddan Pnamesebagai kunci utama .

Saya sekarang ingin memasukkan satu kolom lagi di kunci utama - PMID. Bagaimana saya bisa menulis ALTERpernyataan untuk melakukan ini? (Saya sudah memiliki 1000 catatan dalam tabel)

jay
sumber
8
Apakah kamu yakin ini berarti Anda diperbolehkan memiliki duplikat personIddi tabel Anda. Ini pada gilirannya berarti jika Anda bergabung dari tabel jenis transaksi (banyak) ke tabel ini hanya dengan kunci ini Anda akan mendapatkan catatan duplikat, yang mengarah ke 'penghitungan ganda' dari catatan transaksi.
Nick.McDermaid
6
memang, ini adalah ide yang SANGAT buruk. PK Anda harus dalam "persionId", itu saja
Patrick Honorez
1
Saya pikir hanya satu kolom dalam tabel yang harus ditetapkan sebagai kunci utama?
CHarris
1
@ChristopheHarris, terkadang masuk akal untuk memiliki lebih dari satu kolom sebagai kunci utama. Tabel hubungan satu-ke-banyak atau banyak-ke-banyak kemungkinan akan memiliki 2 atau lebih kolom kunci asing yang menyusun kunci utama, karena hanya mungkin untuk mengidentifikasi secara unik catatan jika Anda mengetahui nilai-nilai semua kunci utama kolom. Namun, dalam kasus OP, tidak mungkin inilah yang sebenarnya ia inginkan.
Kristen Hammack
2
@Kristen Hammack Bahkan dalam kasus hubungan M2M, mungkin lebih baik memiliki tabel perantara memiliki kunci primer terpisah dan kemudian menempatkan batasan bersama unik pada dua kunci asing.
kloddant

Jawaban:

191

jatuhkan batasan dan buat ulang

alter table Persion drop CONSTRAINT <constraint_name>

alter table Persion add primary key (persionId,Pname,PMID)

edit:

Anda dapat menemukan nama kendala dengan menggunakan kueri di bawah ini:

select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='Persion'
and type_desc LIKE '%CONSTRAINT'
Joe G Joseph
sumber
80

Saya pikir sesuatu seperti ini seharusnya berhasil

-- drop current primary key constraint
ALTER TABLE dbo.persion 
DROP CONSTRAINT PK_persionId;
GO

-- add new auto incremented field
ALTER TABLE dbo.persion 
ADD pmid BIGINT IDENTITY;
GO

-- create new primary key constraint
ALTER TABLE dbo.persion 
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);
GO
TI
sumber
1
Mungkin non-cluster adalah pilihan yang baik dalam hal PK komposit untuk kinerja berdasarkan tanggal penyisipan jika itu penting bagi Anda.
Shiv
36
-- create new primary key constraint
ALTER TABLE dbo.persion 
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);

adalah solusi yang lebih baik karena Anda memiliki kendali atas penamaan primary_key.


Ini lebih baik daripada hanya menggunakan

ALTER TABLE Persion ADD PRIMARY KEY(persionId,Pname,PMID)

yang Anda buat nama acak dan dapat menyebabkan masalah saat membuat skrip atau membandingkan database

pengguna3675542
sumber
3
+1 untuk menyorot fungsi untuk memberi nama kunci utama Anda. Saat Anda menjalankan skrip pemutakhiran yang membuat ulang PK, lebih disukai untuk menekan bernama PK daripada harus menginterogasi skema informasi untuk mengetahui nama
e_i_pi
27

Jika Anda menambahkan batasan kunci utama

ALTER TABLE <TABLE NAME> ADD CONSTRAINT <CONSTRAINT NAME> PRIMARY KEY <COLUMNNAME>  

sebagai contoh:

ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO)
K GANGA
sumber
13

Sudah ada kunci utama di tabel Anda. Anda tidak bisa hanya menambahkan kunci utama, jika tidak akan menyebabkan kesalahan. Karena ada satu kunci utama untuk tabel sql.

Pertama, Anda harus melepaskan kunci utama lama Anda.

MySQL:

ALTER TABLE Persion
DROP PRIMARY KEY;

Akses SQL Server / Oracle / MS:

ALTER TABLE Persion
DROP CONSTRAINT 'constraint name';

Anda harus menemukan nama kendala di tabel Anda. Jika Anda telah memberikan nama kendala saat membuat tabel, Anda dapat dengan mudah menggunakan nama kendala (mis: PK_Persion).

Kedua, Tambahkan kunci utama.

Akses MySQL / SQL Server / Oracle / MS:

ALTER TABLE Persion ADD PRIMARY KEY (PersionId,Pname,PMID);

atau yang lebih baik di bawah ini

ALTER TABLE Persion ADD CONSTRAINT PK_Persion PRIMARY KEY (PersionId,Pname,PMID);

Ini dapat menetapkan nama kendala oleh pengembang. Lebih mudah menjaga meja.

Saya sedikit bingung ketika saya melihat semua jawaban. Jadi saya meneliti beberapa dokumen untuk menemukan setiap detail. Semoga jawaban ini dapat membantu pemula SQL lainnya.

Referensi: https://www.w3schools.com/sql/sql_primarykey.asp

劉鎮 瑲
sumber
4

Batasan KUNCI UTAMA secara unik mengidentifikasi setiap catatan dalam tabel database. Kunci primer harus mengandung nilai UNIK dan kolom tidak bisa berisi Nilai NULL.

  -- DROP current primary key 
  ALTER TABLE tblPersons DROP CONSTRAINT <constraint_name>
  Example:
  ALTER TABLE tblPersons 
  DROP CONSTRAINT P_Id;


  -- ALTER TABLE tblpersion
  ALTER TABLE tblpersion add primary key (P_Id,LastName)
Mike Clark
sumber
4

Necromancing.
Kalau-kalau ada orang yang memiliki skema yang sama baiknya dengan saya ...
Berikut adalah cara melakukannya dengan benar:

Dalam contoh ini, nama tabelnya adalah dbo.T_SYS_Language_Forms, dan nama kolomnya adalah LANG_UID

-- First, chech if the table exists...
IF 0 < (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_SCHEMA = 'dbo'
    AND TABLE_NAME = 'T_SYS_Language_Forms'
)
BEGIN
    -- Check for NULL values in the primary-key column
    IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
    BEGIN
        ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 

        -- No, don't drop, FK references might already exist...
        -- Drop PK if exists (it is very possible it does not have the name you think it has...)
        -- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
        --DECLARE @pkDropCommand nvarchar(1000) 
        --SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        --WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
        --AND TABLE_SCHEMA = 'dbo' 
        --AND TABLE_NAME = 'T_SYS_Language_Forms' 
        ----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
        --))
        ---- PRINT @pkDropCommand 
        --EXECUTE(@pkDropCommand) 
        -- Instead do
        -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms';

        -- Check if they keys are unique (it is very possible they might not be)        
        IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
        BEGIN

            -- If no Primary key for this table
            IF 0 =  
            (
                SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND TABLE_SCHEMA = 'dbo' 
                AND TABLE_NAME = 'T_SYS_Language_Forms' 
                -- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
            )
                ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
            ;

        END -- End uniqueness check
        ELSE
            PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
    END -- End NULL check
    ELSE
        PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
END 
Stefan Steiger
sumber
Poin yang sangat bagus tentang 'jangan jatuhkan, referensi FK mungkin sudah ada'. Jawaban lain tidak berhasil untuk saya karena ini.
sgryzko
2

Silakan coba ini-

ALTER TABLE TABLE_NAME DROP INDEX `PRIMARY`, ADD PRIMARY KEY (COLUMN1, COLUMN2,..);
Samir
sumber
1

Coba gunakan kode ini:

ALTER TABLE `table name` 
    CHANGE COLUMN `column name` `column name` datatype NOT NULL, 
    ADD PRIMARY KEY (`column name`) ;
Rekha Rajan
sumber
1
ALTER TABLE TABLE_NAME ADD PRIMARY KEY(`persionId`,`Pname`,`PMID`)
Harry Singh
sumber