none
primary key RRS feed

  • Domanda

  • Se elimino un vincolo di primary key su una tabella ( l'indice cluster è creato in automatico su tale vincolo ) verrà eliminato anche l'indice cluster e quindi ricreato l'heap?
    mercoledì 7 aprile 2010 14:22

Risposte

  • Se elimino un vincolo di primary key su una tabella ( l'indice cluster è creato in automatico su tale vincolo ) verrà eliminato anche l'indice cluster e quindi ricreato l'heap?


    Ciao Luca,

    Esatto. Per definizione un heap è una tabella senza indici clustered. Interrogando la catalog view sys.partition, un heap avrà la colonna index_id = 0, un indice clustered  a 1 e un indice non clustered un valore > 1. In alternativa possiamo interrogare la catalog view sys.indexes dove la colonna type_desc ci dirà il tipo di indice (se presente) oppure ci indicherà se ci troviamo di fronte ad un heap.

    Osserva il seguente esempio: 

    USE tempdb;
    
    CREATE TABLE dbo.Students(
    StudentID int NOT NULL,
    FirstName varchar(10) NOT NULL,
    LastName varchar(10) NOT NULL,
    CONSTRAINT PK_Students PRIMARY KEY(StudentID)
    );
    
    SELECT object_id, name, type_desc, is_primary_key
    FROM sys.indexes
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   name         type_desc  is_primary_key
    ----------- ------------ ---------- ---------------
    197575742   PK_Students  CLUSTERED  1
    
    (1 row(s) affected)
    
    */
    
    SELECT [object_id], OBJECT_NAME([object_id]) AS tabella, index_id
    FROM  sys.partitions 
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   tabella   index_id
    ----------- --------- -----------
    197575742   Students  1
    
    (1 row(s) affected)
    
    */
    
    ALTER TABLE dbo.Students
    DROP CONSTRAINT PK_Students;
    
    SELECT object_id, name, type_desc, is_primary_key
    FROM sys.indexes
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   name         type_desc  is_primary_key
    ----------- ------------ ---------- ---------------
    197575742   NULL         HEAP       0
    
    (1 row(s) affected)
    
    */
    
    SELECT [object_id], OBJECT_NAME([object_id]) AS tabella, index_id
    FROM  sys.partitions 
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   tabella   index_id
    ----------- --------- -----------
    197575742   Students  0
    
    (1 row(s) affected)
    
    */
    
    DROP TABLE dbo.Students;

     Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    mercoledì 7 aprile 2010 14:50
    Moderatore

Tutte le risposte

  • Se elimino un vincolo di primary key su una tabella ( l'indice cluster è creato in automatico su tale vincolo ) verrà eliminato anche l'indice cluster e quindi ricreato l'heap?


    Ciao Luca,

    Esatto. Per definizione un heap è una tabella senza indici clustered. Interrogando la catalog view sys.partition, un heap avrà la colonna index_id = 0, un indice clustered  a 1 e un indice non clustered un valore > 1. In alternativa possiamo interrogare la catalog view sys.indexes dove la colonna type_desc ci dirà il tipo di indice (se presente) oppure ci indicherà se ci troviamo di fronte ad un heap.

    Osserva il seguente esempio: 

    USE tempdb;
    
    CREATE TABLE dbo.Students(
    StudentID int NOT NULL,
    FirstName varchar(10) NOT NULL,
    LastName varchar(10) NOT NULL,
    CONSTRAINT PK_Students PRIMARY KEY(StudentID)
    );
    
    SELECT object_id, name, type_desc, is_primary_key
    FROM sys.indexes
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   name         type_desc  is_primary_key
    ----------- ------------ ---------- ---------------
    197575742   PK_Students  CLUSTERED  1
    
    (1 row(s) affected)
    
    */
    
    SELECT [object_id], OBJECT_NAME([object_id]) AS tabella, index_id
    FROM  sys.partitions 
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   tabella   index_id
    ----------- --------- -----------
    197575742   Students  1
    
    (1 row(s) affected)
    
    */
    
    ALTER TABLE dbo.Students
    DROP CONSTRAINT PK_Students;
    
    SELECT object_id, name, type_desc, is_primary_key
    FROM sys.indexes
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   name         type_desc  is_primary_key
    ----------- ------------ ---------- ---------------
    197575742   NULL         HEAP       0
    
    (1 row(s) affected)
    
    */
    
    SELECT [object_id], OBJECT_NAME([object_id]) AS tabella, index_id
    FROM  sys.partitions 
    WHERE object_id = OBJECT_ID(N'dbo.Students');
    
    /* Output:
    
    object_id   tabella   index_id
    ----------- --------- -----------
    197575742   Students  0
    
    (1 row(s) affected)
    
    */
    
    DROP TABLE dbo.Students;

     Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    mercoledì 7 aprile 2010 14:50
    Moderatore
  • Grazie, sempre molto gentile. Ciao!
    mercoledì 7 aprile 2010 18:15