2

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

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

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

4

7 回答 7

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

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

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

于 2009-07-06T13:39:49.243 回答
3

如果您没有任何独特之处需要担心:

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

否则,John Saunders 的答案可能是您最好的选择。

于 2009-07-06T13:32:35.067 回答
0

如果您的主键字段具有自动标识符,那么您很可能能够编写脚本来询问系统以查找不在 PK 中的字段,并将现有值用于那些不在 PK 中的字段并且只插入那些(或null插入PK 字段)。

因此,我认为不会有“标准”方式。

于 2009-07-06T13:35:31.837 回答
0

我不是 Access 人员,但在 SQL Server 中,您可以在 SQL Server Management Studio 中选择“脚本表为 --> 插入”。您可以轻松地修改它以将您想要的行过滤到 INSERT INTO SELECT 语句中。

Access中可能存在类似的东西?

于 2009-07-06T13:41:16.090 回答
0

就像人们在我之前所说的那样,您可以执行“INSERT INTO TBL SELECT * FROM TBL WHERE X=Y”,您将得到一行。如果您有主键,这将失败。

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

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

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

于 2009-07-06T13:43:23.857 回答
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
于 2009-07-08T10:06:52.953 回答
0

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

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

于 2009-07-08T10:47:33.510 回答