Mám existující tabulku s názvem Persion
. V této tabulce mám 5 sloupců:
Když jsem vytvořil tuto tabulku, nastavil jsem PersionId
a Pname
jako primární klíč.
Nyní chci do primárního klíče zahrnout ještě jeden sloupec - PMID. Jak k tomu mohu napsat příkaz ALTER
? (V tabulce již mám 1000 záznamů)
přetáhněte omezení a znovu jej vytvořte
alter table Persion drop CONSTRAINT <constraint_name>
alter table Persion add primary key (persionId,Pname,PMID)
upravit:
název omezení najdete pomocí následujícího dotazu:
select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='Persion'
and type_desc LIKE '%CONSTRAINT'
Myslím, že by něco takového mělo fungovat
-- 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
-- create new primary key constraint
ALTER TABLE dbo.persion
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);
je lepší řešení, protože máte kontrolu nad pojmenováním primárního_key.
Je to lepší než jen používat
ALTER TABLE Persion ADD PRIMARY KEY(persionId,Pname,PMID)
který vytváří náhodná jména a může způsobit problémy při skriptování nebo porovnávání databází
Pokud přidáte omezení primárního klíče
ALTER TABLE <TABLE NAME> ADD CONSTRAINT <CONSTRAINT NAME> PRIMARY KEY <COLUMNNAME>
například:
ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO)
Omezení PRIMARY KEY jednoznačně identifikuje každý záznam v databázové tabulce. Primární klíče musí obsahovat hodnoty UNIQUE a sloupec nesmí obsahovat hodnoty 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)
Necromancing.
Jen pro případ, že by někdo měl stejně dobré schéma, se kterým by mohl pracovat jako já ...
Zde je návod, jak to udělat správně:
V tomto příkladu je název tabulky dbo.T_SYS_Language_Forms a název sloupce je 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
Zkuste to-
ALTER TABLE TABLE_NAME DROP INDEX `PRIMARY`, ADD PRIMARY KEY (COLUMN1, COLUMN2,..);
V tabulce je již primární klíč. Nemůžete přidat pouze primární klíč, jinak způsobí chybu. Protože existuje jeden primární klíč pro tabulku sql.
Nejprve musíte zrušit starý primární klíč.
MySQL:
ALTER TABLE Persion
DROP PRIMARY KEY;
SQL Server/Oracle/MS Access:
ALTER TABLE Persion
DROP CONSTRAINT 'constraint name';
V tabulce musíte najít název omezení. Pokud jste při vytváření tabulky zadali název omezení, můžete snadno použít název omezení (např .: PK_Persion).
Za druhé, Přidejte primární klíč.
MySQL/SQL Server/Oracle/MS Access:
ALTER TABLE Persion ADD PRIMARY KEY (PersionId,Pname,PMID);
nebo lepší níže
ALTER TABLE Persion ADD CONSTRAINT PK_Persion PRIMARY KEY (PersionId,Pname,PMID);
To může nastavit název omezení vývojářem. Je snazší udržovat stůl.
Když jsem se podíval na všechny odpovědi, trochu jsem se zmást. Takže zkoumám nějaký dokument, abych našel každý detail. Doufám, že tato odpověď může pomoci dalším začátečníkům jazyka SQL.
ALTER TABLE TABLE_NAME ADD PRIMARY KEY(`persionId`,`Pname`,`PMID`)
Zkuste použít tento kód:
ALTER TABLE `table name`
CHANGE COLUMN `column name` `column name` datatype NOT NULL,
ADD PRIMARY KEY (`column name`) ;