2009-07-06 8 views
1

Ich möchte eine Zeile duplizieren, nicht die Schlüssel natürlich, ohne die Feldnamen explizit zu verwenden.
Gibt es eine SQL-Art oder muss ich die Feldnamen durch Code aufzählen?

Ich möchte nicht explizit Feldnamen verwenden, weil ich Code und DB-Abhängigkeiten minimieren möchte.

Ich werde es in der Ms Access 2003 verwenden. Ich erwähne es, falls kein Standard Weg existiert.Gibt es eine Standardmethode zum Duplizieren einer Zeile in einer Datenbanktabelle?

Antwort

5
INSERT INTO `<table>` (column1, column2, ...) -- Not IDENTITY columns 
SELECT column1, column2, ... FROM ... 

Dies erlaubt es Ihnen auch Ersatzwerte für die Primärschlüsselspalten einfügen usw. habe das ich verwendete, zusammen mit einem allgemeinen Tabellenausdruck, eine Reihe von Testdaten aus dem Monat Februar zu nehmen, und so zu tun, als wären sie wirklich von Juni.

Ich weiß, Sie sagten, Sie wollen es ohne die Feldnamen tun, aber ich glaube nicht, dass Sie können. Es ist auch keine gute Idee, da es Sie an die Reihenfolge der Spalten binden würde.

+0

Ja, hör auf zu weinen und schreibe einen Code :-) +1. – paxdiablo

+0

John, diese Art von Code möchte ich vermeiden. Vielleicht erzeuge ich es automatisch mit VBA-Code. –

+0

@Nick D. Du musst. Es gibt keine generische Art zu sagen: Fügen Sie alle Spalten ein, außer die, die ich nicht haben möchte. –

3

Wenn Sie keine unique befürchten:

INSERT INTO <table> (SELECT * FROM <table> WHERE <condition>) 

Ansonsten John Saunders' answer ist wahrscheinlich die beste Wahl.

+2

-1: Funktioniert nicht, wenn Primärschlüssel oder eindeutige Bedingungen vorhanden sind. –

+1

Er bat um eine doppelte Zeile, ohne irgendwelche Feldnamen zu erwähnen; Das Arbeiten mit eindeutigen Einschränkungen verhindert, dass Sie ein exaktes Duplikat erhalten. Dazu müssen Sie die Feldnamen angeben, die Sie kopieren möchten. –

+0

Dann ist sicherlich die richtige Antwort, @Noah, "Nein, du kannst es nicht tun". – paxdiablo

0

Wenn Ihre Primärschlüsselfelder automatische Bezeichner haben, können Sie Skripts erstellen, um das System nach Feldern abzufragen, die nicht in der PK sind, und die vorhandenen Werte für diejenigen verwenden, die diese nicht einfügen (oder Einfügen von null für die PK-Felder).

Folglich denke ich nicht, dass es einen "Standard" Weg geben wird.

0

Ich bin keine Access-Person, aber in SQL Server können Sie wählen "Skripttabelle als -> Einfügen in" in SQL Server Management Studio. Sie können dies leicht ändern, um die gewünschten Zeilen in eine INSERT INTO SELECT-Anweisung zu filtern.

Vielleicht existiert so etwas in Access?

+0

Ich bin auch kein Access-Person :) ok, ich werde es überprüfen. –

+0

Keine solche Einrichtung existiert in Access. Oder Jet/ACE, für diese Angelegenheit. –

+0

Das ist eine Schande, ich denke, Sie könnten die Tabelle in SQL Server importieren und dann das Skript erstellen und in Access ausführen, aber das ist wahrscheinlich mehr Aufwand, als es wert ist, und nimmt an, dass der Benutzer SQL Server hat. – RichardOD

0

Wie die Leute vor mir gesagt haben, können Sie tun "INSERT IN TBL SELECT * Von TBL WHERE X = Y" und Sie erhalten eine Zeile. Und dies wird fehlschlagen, wenn Sie einen Primärschlüssel haben.

Wenn Sie kein PK haben, haben Sie wahrscheinlich größere Probleme.

Ist dies eine verknüpfte Tabelle? Wenn dies der Fall ist, gibt es keine Datenbankabhängigkeiten, da es sich um eine ODBC-Verbindung handelt. In diesem Fall können Sie diese leicht 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 durchlaufen nur die Spalten.

+0

1,1s/Primärschlüssel/Unique Constraint/- Ein Primärschlüssel ist nur eine Art von eindeutiger Constraint. – paxdiablo

0

Ms Access 2003 orientierte 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 von einigen anderer Rekord.

kam ich auf die 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 
0

Sie benötigen würde für die Feldnamen explizit liefern die Schlüssel, wenn Sie Ersatzwerte liefern, also ein "Standard" Weg ist einfach nicht möglich.

... es sei denn, alle Ihre Tabellen haben einen einzigen Schlüssel, alle mit dem gleichen Namen (ID ist beliebt), und jeder Schlüssel besteht aus einer einzigen Spalte mit der IDENTITY (autonumber) -Eigenschaft, in welchem ​​Fall Sie in Tatsächlich haben sie überhaupt keine Schlüssel, nur eine Möglichkeit, den IDENTITY-Wert zu verwenden, um Ihre doppelten Zeilen eindeutig zu identifizieren!

Verwandte Themen