When you execute
ALTER TABLE someTable ADD CONSTRAINT PK_someTable PRIMARY KEY (id);
if there is no clustered index on someTable
then the PK will be a clustered PK. Otherwise, if there is a clustered index before executing ALTER .. ADD ... PRIMARY KEY (id)
the PK will be a non-clustered PK.
-- Test #1
BEGIN TRAN;
CREATE TABLE dbo.MyTable
(
id INT NOT NULL,
Col1 INT NOT NULL,
Col2 VARCHAR(50) NOT NULL
);
SELECT i.name, i.index_id, i.type_desc
FROM sys.indexes i
WHERE i.object_id = OBJECT_ID(N'dbo.MyTable');
/*
name index_id type_desc
---- ----------- ---------
NULL 0 HEAP
*/
ALTER TABLE dbo.MyTable
ADD CONSTRAINT PK_MyTable PRIMARY KEY (id);
SELECT i.name, i.index_id, i.type_desc
FROM sys.indexes i
WHERE i.object_id = OBJECT_ID(N'dbo.MyTable');
/*
name index_id type_desc
----------- ----------- ---------
PK_MyTable 1 CLUSTERED
*/
ROLLBACK;
-- Test #2
BEGIN TRAN;
CREATE TABLE dbo.MyTable
(
id INT NOT NULL,
Col1 INT NOT NULL,
Col2 VARCHAR(50) NOT NULL
);
SELECT i.name, i.index_id, i.type_desc FROM sys.indexes i WHERE i.object_id = OBJECT_ID(N'dbo.MyTable');
/*
name index_id type_desc
---- ----------- ---------
NULL 0 HEAP
*/
CREATE CLUSTERED INDEX ix1
ON dbo.MyTable(Col1);
SELECT i.name, i.index_id, i.type_desc FROM sys.indexes i WHERE i.object_id = OBJECT_ID(N'dbo.MyTable');
/*
name index_id type_desc
---- ----------- ---------
ix1 1 CLUSTERED
*/
ALTER TABLE dbo.MyTable
ADD CONSTRAINT PK_MyTable PRIMARY KEY (id);
SELECT i.name, i.index_id, i.type_desc FROM sys.indexes i WHERE i.object_id = OBJECT_ID(N'dbo.MyTable');
/*
name index_id type_desc
---------- ----------- ------------
ix1 1 CLUSTERED
PK_MyTable 2 NONCLUSTERED
*/
ROLLBACK;