有没有标准的方法来复制数据库表中的行?

时间:2009-07-06 13:28:21

标签: sql ms-access duplicate-data

我想复制一行而不是键,当然没有明确使用字段名称 有SQL方法还是我必须通过代码枚举字段名称?

我不想明确使用字段名称,因为我想最小化代码和数据库依赖项。

我将在Ms Access 2003中使用它。如果不存在标准方法,我会提及它。

7 个答案:

答案 0 :(得分:5)

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

这也允许您插入主键列的替换值等。我已经使用它和一个公用表表达式来获取2月份的一组测试数据,并假装它们真的是六月份。

我知道你说你想在没有字段名称的情况下这样做,但我认为你不能。这也不是一个好主意,因为它会将你与列的顺序联系起来。

答案 1 :(得分:3)

如果你没有任何独特的担忧:

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

否则,John Saunders' answer可能是您最好的选择。

答案 2 :(得分:0)

如果您的主键字段具有自动标识符,那么您可能能够编写脚本以使系统与不在PK中的字段进行交互,并将现有值用于那些不存在且仅插入那些字段的字段(或者为PK字段插入null)。

因此,我认为不存在“标准”方式。

答案 3 :(得分:0)

我不是Access用户,但在SQL Server中,您可以在SQL Server Management Studio中选择“脚本表为 - &gt;插入到”。您可以轻松地修改它以将所需的行过滤到INSERT INTO SELECT语句中。

Access中可能存在类似的内容吗?

答案 4 :(得分:0)

就像大家在我之前所说的那样,你可以“插入TBL SELECT *从TBL WHERE X = Y”,你会得到一行。如果您有主键,这将失败。

如果你没有PK,那么你可能会遇到更大的问题。

这是链接表吗?如果是这样,则没有数据库依赖项,因为您正在处理ODBC链接。在这种情况下,您可以轻松地使用它来获取表的列列表:

SELECT TOP 0 * FROM TBL(在链接的tbl上需要往返服务器)
你得到一个空记录集,你只需遍历列。

答案 5 :(得分:0)

Ms Access 2003 面向解决方案

我有一个表单,用户可以按下按钮创建当前记录的新版本 Ms Access中的那部分很简单:

DoCmd.GoToRecord , , acNewRec

现在我需要更新表单上的所有字段(控件与表字段绑定),除了键,即“id”字段,以及来自其他记录的数据。

我提出了以下例程,这对我有用:

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


我这样用它:

DoCmd.GoToRecord , , acNewRec
UpdateRow "TableName", "KeyName", "some_previous_key_value"
Form.Refresh

答案 6 :(得分:0)

当您提供替换值时,您需要明确提供键的字段名称,因此根本不可能采用“标准”方式。

...除非所有表都有一个密钥,所有表都具有相同的名称(ID很受欢迎),并且每个密钥都包含一个具有IDENTITY(autonumber)属性的列,在这种情况下,您实际上就是根本没有密钥,只是一种使用IDENTITY值来唯一标识重复行的方法!

相关问题