Gibt es eine Standardmethode zum Duplizieren einer Zeile in einer Datenbanktabelle?
-
23-08-2019 - |
Frage
Ich möchte eine Zeile duplizieren, natürlich nicht die Schlüssel, ohne die Feldnamen explizit zu verwenden.
Gibt es eine SQL-Methode oder muss ich die Feldnamen per Code aufzählen?
Ich möchte Feldnamen nicht explizit verwenden, da ich Code- und Datenbankabhängigkeiten minimieren möchte.
Ich werde es im Ms Access 2003 verwenden.Ich erwähne es für den Fall, dass es keinen Standardweg gibt.
Lösung
INSERT INTO `<table>` (column1, column2, ...) -- Not IDENTITY columns
SELECT column1, column2, ... FROM ...
Dies ermöglicht es Ihnen auch Ersatzwerte für die Primärschlüsselspalten einfügen, etc. Ich habe diese verwendet, zusammen mit einem allgemeinen Tabellenausdruck, eine Reihe von Testdaten aus dem Monat Februar zu nehmen, und sie so zu tun, bin wirklich von Juni.
Ich weiß, Sie sagten, Sie es ohne die Feldnamen tun wollen, aber ich glaube nicht, Sie können. Es ist auch keine gute Idee, da es Sie in der Reihenfolge der Spalten binden würde.
Andere Tipps
Wenn Sie keine unique zu befürchten:
INSERT INTO <table> (SELECT * FROM <table> WHERE <condition>)
Ansonsten Antwort John Saunders ist wahrscheinlich die beste Wahl.
Wenn Ihre Primärschlüsselfelder automatische Identifikatoren haben, dann könnten Sie auch in der Lage sein, Skript, das System für Felder interogate, die nicht in der PK, und verwenden Sie die vorhandenen Werte für diejenigen, die nicht und legt nur die Einsen (oder einfügen null
für die PK-Felder).
Folglich glaube ich nicht, es wird eine „Standard“ Art und Weise sein.
Ich bin kein Zugang Person, aber in SQL Server können Sie "Script-Tabelle als -> Einfügen in" wählen in SQL Server Management Studio. Sie können dies leicht ändern Sie die Zeilen, die Sie wollen in eine INSERT INTO SELECT-Anweisung zu filtern.
Vielleicht so etwas wie dies existiert in Access?
Wie Leute vor mir gesagt haben, können Sie tun, „INSERT INTO TBL SELECT * FROM TBL X = Y“ und Sie werden eine Reihe bekommen. Und dies wird fehlschlagen, wenn Sie einen Primärschlüssel haben.
Wenn Sie keine PK haben, dann haben Sie wahrscheinlich größere Probleme.
Ist das eine verknüpfte Tabelle? Wenn ja, gibt es keine Datenbank Abhängigkeiten, da Sie mit einer ODBC-Verbindung handelt. In diesem Fall können Sie einfach diese verwenden, um eine Liste der Spalten für die Tabelle zu erhalten:
SELECT TOP 0 * FROM TBL (verlinkter TBL wird eine Rundfahrt mit dem Server benötigen)
Sie erhalten einen leeren Re-Cord, und Sie wiederholen nur durch die Spalten.
Ms Access 2003 orientiert Lösung
Ich habe ein Formular, in dem der Benutzer einen Knopf drücken kann, eine neue Version des aktuellen Datensatz zu erstellen.
Der Teil in MS Access ist einfach:
DoCmd.GoToRecord , , acNewRec
Jetzt muss ich alle Felder auf dem Formular aktualisieren (Kontrollen sind bind mit Tabellenfelder) mit Ausnahme der Schlüssel, das heißt „id“ -Feld, mit Daten aus einem anderen Datensatz.
Ich kam mit der unten Routine, die gut für mich gearbeitet:
Private Sub UpdateRow(tblname As String, key_name As String, key_value As String)
Dim Rst As Recordset
Dim field As field
Set DB = CurrentDb
Set Rst = DB.OpenRecordset("select * from " & tblname & " where " & _
key_name & "=" & key_value, dbOpenDynaset)
For Each field In Rst.Fields
If field.Name <> key_name Then
Form(field.Name) = field
End If
Next field
Rst.Close
Set Rst = Nothing
Set DB = Nothing
End Sub
Und ich benutze es wie folgt aus:
DoCmd.GoToRecord , , acNewRec
UpdateRow "TableName", "KeyName", "some_previous_key_value"
Form.Refresh
Sie müssten die Feldnamen für die Schlüssel explizit angeben, wenn Sie Ersatzwerte angeben, daher ist eine „Standard“-Methode einfach nicht möglich.
...es sei denn, alle Ihre Tabellen haben einen einzigen Schlüssel, alle mit demselben Namen (ID ist beliebt), und jeder Schlüssel besteht aus einer einzelnen Spalte mit der Eigenschaft IDENTITY (automatische Nummerierung). In diesem Fall hätten Sie tatsächlich keine Schlüssel überhaupt, lediglich eine Möglichkeit, den IDENTITY-Wert zu verwenden, um Ihre doppelten Zeilen eindeutig zu identifizieren!