Announcement

Collapse
No announcement yet.

Drop primary key

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Drop primary key

    Hallo liebe DB-Experten,

    wie lösche ich mein PK in MSSQL 2012?

    Ich weiß, das dies durch
    ALTER TABLE [table_name] DROP CONSTRAINT [constraint_name]
    gemacht werden kann.

    Da ich ein automatisches Script bereitstellen möchte, würde ich gern wissen, wie es OHNE Constraintname geht, da dieser nicht aus dem Schema kommt - ist mir unbekannt.
    Es ist doch sooooo einfach in Oracle oder in MySql!!!!

    Ich freue mich auf eure Hilfe und danke im Voraus!

  • #2
    Hallo study11,

    ich habe zur Zeit keine SQL-Server-DB greifbar, aber schau Dir mal auf der DB an was Du unter dem INFORMATION_SCHEMA findest. Irgendwas mit TABLE_CONSTRAINTS oder so ähnlich. Da findest Du die Zuordnung PrimaryKey-Constraint zu Tabelle.

    Gruß
    Uschi

    Comment


    • #3
      Einen anonymen Befehl scheint es bei MS nicht zu geben, so soll es gehen laut http://stackoverflow.com/questions/1...owing-its-name
      Code:
      CREATE TABLE PKTest ( ID INT PRIMARY KEY ) ;
      
      DECLARE @SQL VARCHAR(4000)
      SET @SQL = 'ALTER TABLE PKTEST DROP CONSTRAINT |ConstraintName| '
      
      SET @SQL = REPLACE(@SQL, '|ConstraintName|', ( SELECT   name
                                                     FROM     sysobjects
                                                     WHERE    xtype = 'PK'
                                                              AND parent_obj = OBJECT_ID('PKTest')
                                                   ))
      
      EXEC (@SQL)
      
      DROP TABLE PKTest
      Man muss natürlich sicherstellen, dass man wirklich den richtigen Namen erwischt. Würde ich also bisschen testen, bevor ich das verteile.
      Gruß, defo

      Comment


      • #4
        Als Stored Procedure gekapselt.
        Warum willst du die denn löschen? PKs sind wichtig die sollen nicht einfach einfach zu löschen sein

        [HIGHLIGHT=sql]CREATE PROCEDURE usp_DropPK(@tabName nvarchar(255))
        AS
        BEGIN
        DECLARE @pkName nvarchar(255)
        SELECT @pkName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @tabName
        EXEC ('ALTER TABLE ' + @tabName + ' DROP CONSTRAINT ' + @pkName);
        END
        GO

        EXEC usp_DropPK 'meinLieberTabellenName'
        [/HIGHLIGHT]
        Zuletzt editiert von Ralf Jansen; 29.01.2015, 21:10. Reason: von sys auf INFORMATION_SCHEMA schema umgestellt

        Comment


        • #5
          Hallo Uschi,
          den Constraintnamen zu bestimmen wäre kein Problem, wenn ich selbst den Script ausführen müsse.
          Ich danke dir für den Vorschlag.

          Comment


          • #6
            Hallo Defo, hallo Ralf,

            eure Lösungsvorschläge sehen beide gut aus. Mal schauen, was ich nehme.
            Ich danke euch für eure Tipps - die Hilfe kam super-schnell, wie immer!
            Also, danke-danke-danke...

            PS Ja, die PK's sollen gelöscht werden, da sie irgendwann (fragt mich nicht wie) über 2 Spalten angelegt worden sind, nun soll es zusammen mit den anderen Dingen geändert werden.

            Comment


            • #7
              Originally posted by study11 View Post
              PS Ja, die PK's sollen gelöscht werden, da sie irgendwann (fragt mich nicht wie) über 2 Spalten angelegt worden sind, nun soll es zusammen mit den anderen Dingen geändert werden.
              Tja, also zu den Primärschlüsselconstraints gehören gewöhnlich auch mal gern Fremdschlüsselconstraints, die auf erstere zeigen. Weiter, neben dem Drop der Constraint Regel erfolgt wahrscheinlich auch implizit ein Drop des zugehörigen Index. Bei größeren Tabellen kann das ganz schön Theater geben und Durcheinander und es muss klar sein, wie Verweise auf den gelöschten PK nach dessen Neuerstellung bzw. Änderung rekonstruiert werden.
              Apropos Neuerstellung des PK: der Name eines Constraints (nicht nur Primärschlüssel) ist kein Schicksal, sondern kann bei der Erzeugung mit angegeben werden. Dann weiß man, was man hat. Das hilft u.U. auch mal bei Fehlermeldungen, die nur den (sonst automatisch generierten und nichtssagenden) Constraintnamen enthalten.
              Gruß, defo

              Comment

              Working...
              X