none
TRUNKATE RRS feed

  • Frage

  • ich habe Delete und Truncate angewendet aber nach der Eingabe: TRUNCATE TABLE<>Hauptgruppe> habe ich bestädigt und

    nichts hat sich getan.Was ist falsch gelaufen.?

    Ich haben Visual Basic 2010, Microsoft Server Compact 3,5 und 4,00

    ich habe in der Datei Fremdschlüssel und Primärschlüssel.

    Oder liegt es an meine Datenbank "sdf" ?

    Samstag, 25. Mai 2019 10:14

Antworten

  • Hi,

    beschreib doch bitte mal, was genau Du wo und in welcher Form gemacht hast, was Du wo und wie "bestätigt" hast und was exakt dann passiert ist.

    TRUNCATE TABLE Tabellenname

    geht im richtigen nur, wenn kein Fremdschlüssel auf diese Tabelle verweist. Unter SQL Server Compact (auch 4.0) gibt es AFAIK keinen TRUNCATE Befehl.

    DELETE FROM Tabellenname

    geht eigentlich immer, es sei denn, es existieren noch Fremdschlüssel, die auf NOT NULL stehen und bei denen ON DELETE CASCADE nicht angegeben wurde. In dem Fall sollte aber eine Fehlermeldung kommen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 25. Mai 2019 13:34
    Moderator
  • Hallo Horst,

    nein, das liegt daran, dass die entsprechende Spalte als IDENTITY deklariert ist und beim Löschen von Datensätzen der Zähler nicht zurückgesetzt wird.

    Mit folgendem Aufruf kannst Du nach dem vollständigen Leeren der Tabelle den Wert zurücksetzen.

    DBCC CHECKIDENT ( 'dbo.DeineTabelle', RESEED, 1 );

    BTW: DELETE FROM <Tabellenname> reicht völlig, WHERE 1 = 1 ist in diesem Fall unnötig.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 30. Mai 2019 14:14
    Moderator
  • Hallo Horst,

    das geht im SSMS nur in einem Abfragefenster, nicht in der Abfragedefinition (mit der man eh nie arbeiten sollte, da die automatischen Formatierungen und Umwandlungen der Objektnamen ziemlich daneben sind).

    Im SSMS gibt es den Button "Neue Abfrage" in der Standardsymbolleiste (alternativ Strg+N oder Datei -> Neu -> Abfrage mit aktueller Verbindung). Klick da mal drauf und gib den Befehl dort ein.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 1. Juni 2019 11:22
    Moderator

Alle Antworten

  • Hi,

    beschreib doch bitte mal, was genau Du wo und in welcher Form gemacht hast, was Du wo und wie "bestätigt" hast und was exakt dann passiert ist.

    TRUNCATE TABLE Tabellenname

    geht im richtigen nur, wenn kein Fremdschlüssel auf diese Tabelle verweist. Unter SQL Server Compact (auch 4.0) gibt es AFAIK keinen TRUNCATE Befehl.

    DELETE FROM Tabellenname

    geht eigentlich immer, es sei denn, es existieren noch Fremdschlüssel, die auf NOT NULL stehen und bei denen ON DELETE CASCADE nicht angegeben wurde. In dem Fall sollte aber eine Fehlermeldung kommen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 25. Mai 2019 13:34
    Moderator
  • Der wesentliche Unterschied ist noch, dass ein Delete per Rollback wiederhergestellt werden kann, ein Truncate journalisiert nicht. Diese Daten sind dann wirklich weg.
    Samstag, 25. Mai 2019 17:07
  • Hallo Stefan,

    Vielen Dank für diese Antwort.

    Ich bin schon 30 Jahre in der Programmierung und habe ab Visual Basic 4 programmiert.

    Ich wollte mit Datenbanken SQL anfangen und habe mir angeblich ein IT Spezialist besorgt der mir alles eingerichtet hat.

    Ich habe über 20 Tabellen angelegt und arbeite schon 1 Jahr mit diesen.

    Ich muss Tabellen löschen und bei Tabellen Nr. 1 wieder anfangen.

    Was oder wie kann ich machen um die Tabellen zu löschen ?

    Dienstag, 28. Mai 2019 15:43
  • Hi,

    ich verstehe die Frage so, dass Du die Tabellen an sich und nicht nur deren Inhalte löschen willst?

    Falls dem so ist, geht das bspw. so:

    DROP TABLE Tabellenname

    Du musst aber auch hier darauf achten, dass Du bei Fremdschlüsselverweisen zuerst die Tabellen löschst, die auf die Haupttabelle verweisen.

    Ein Beispiel:

    [Kunden]
    ID
    ...
    
    [Artikel]
    ID
    ...
    
    [Bestellungen]
    ID
    KundenId  => Verweis auf Kunden.ID
    ArtikelId => Verweis auf Artikel.ID
    ...

    In dem Fall musst Du die Tabelle "Bestellungen" vor "Artikel" und/oder "Kunden" löschen, da es sonst wegen der Fremdschlüsselverweise auf diese Tabelle zu einem Fehler kommt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 28. Mai 2019 15:51
    Moderator
  • Hallo Stefan,

    Ich muss mich entschuldigen, ich meinte nur die Inhalte der Tabellen löschen.

    Vielen Dank Horst

    Mittwoch, 29. Mai 2019 09:06
  • Auch da ist die Reihenfolge des Löschens wichtig.
    Verweist also eine Tabelle per Fremdschlüssel auf eine andere, so ist diese zuerst zu löschen => Hierarchie.

    Ein Auftrag kann nur gelöscht werden, wenn dessen Positionen zuvor gelöscht werden.

    Ist der Constrant per "on delete cascade" definiert, klappt natürlich kein Truncate, da geht nur ein "Delete from Table", da dann die abhängigen Tabellen gleich mitgelöscht werden.

    Mittwoch, 29. Mai 2019 09:12
  • Hallo Stefan,

    Es hat geklappt, mit "Delete From Hauptgruppe Where 1=1"

    Nur die laufende Satz Nr. (der letzte Satz  war 17, bleibt stehen) ,und fängt mit 18 wieder an.

     liegt das an der Where Bedingung ?.

    Herzlichen Dank

    Horst

    Donnerstag, 30. Mai 2019 13:31
  • Hallo Horst,

    nein, das liegt daran, dass die entsprechende Spalte als IDENTITY deklariert ist und beim Löschen von Datensätzen der Zähler nicht zurückgesetzt wird.

    Mit folgendem Aufruf kannst Du nach dem vollständigen Leeren der Tabelle den Wert zurücksetzen.

    DBCC CHECKIDENT ( 'dbo.DeineTabelle', RESEED, 1 );

    BTW: DELETE FROM <Tabellenname> reicht völlig, WHERE 1 = 1 ist in diesem Fall unnötig.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 30. Mai 2019 14:14
    Moderator
  • Hallo Stefan,

    Ich habe den SQL Code eingegeben,

    aber es kommt eine Nachricht:

    Das SQL Konstrukt  oder die Anweisung "DBCC" wird nicht unterstützt.

    Die Abfrage kann im Diagrammbereich und im Kriterienbereich nicht graphisch dargestellt werden.

    DBCC CHECKIDENT('dbo.Vertreter',RESEED,1)

    Mit freundlichen Grüßen

    Horst

    Samstag, 1. Juni 2019 10:43
  • Hallo Horst,

    das geht im SSMS nur in einem Abfragefenster, nicht in der Abfragedefinition (mit der man eh nie arbeiten sollte, da die automatischen Formatierungen und Umwandlungen der Objektnamen ziemlich daneben sind).

    Im SSMS gibt es den Button "Neue Abfrage" in der Standardsymbolleiste (alternativ Strg+N oder Datei -> Neu -> Abfrage mit aktueller Verbindung). Klick da mal drauf und gib den Befehl dort ein.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 1. Juni 2019 11:22
    Moderator