我想复制一行,当然不是键,没有明确使用字段名称。
是否有 SQL 方式或者我必须通过代码枚举字段名称?
我不想明确使用字段名称,因为我想最小化代码和数据库依赖关系。
我将在 Ms Access 2003 中使用它。如果不存在标准方法,我会提到它。
7 回答
INSERT INTO `<table>` (column1, column2, ...) -- Not IDENTITY columns
SELECT column1, column2, ... FROM ...
这也将允许您为主键列等插入替换值。我已经使用它和一个公共表表达式,从 2 月份获取一组测试数据,并假装它们是真的从六月开始。
我知道你说你想在没有字段名称的情况下这样做,但我认为你不能。这也不是一个好主意,因为它会将您与列的顺序联系起来。
如果您没有任何独特之处需要担心:
INSERT INTO <table> (SELECT * FROM <table> WHERE <condition>)
否则,John Saunders 的答案可能是您最好的选择。
如果您的主键字段具有自动标识符,那么您很可能能够编写脚本来询问系统以查找不在 PK 中的字段,并将现有值用于那些不在 PK 中的字段并且只插入那些(或null
插入PK 字段)。
因此,我认为不会有“标准”方式。
我不是 Access 人员,但在 SQL Server 中,您可以在 SQL Server Management Studio 中选择“脚本表为 --> 插入”。您可以轻松地修改它以将您想要的行过滤到 INSERT INTO SELECT 语句中。
Access中可能存在类似的东西?
就像人们在我之前所说的那样,您可以执行“INSERT INTO TBL SELECT * FROM TBL WHERE X=Y”,您将得到一行。如果您有主键,这将失败。
如果您没有PK,那么您可能会遇到更大的问题。
这是链接表吗?如果是这样,则没有数据库依赖关系,因为您正在处理 ODBC 链接。在这种情况下,您可以轻松地使用它来获取表的列列表:
SELECT TOP 0 * FROM TBL(在链接的 tbl 上需要往返服务器)
您得到一个空白记录集,您只需遍历列。
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
当您提供替换值时,您需要显式地提供键的字段名称,因此根本不可能采用“标准”方式。
...除非你所有的表都有一个键,都具有相同的名称(ID 很流行),并且每个键都包含一个具有 IDENTITY (自动编号)属性的列,在这种情况下你实际上没有键根本就只是一种使用 IDENTITY 值来唯一标识重复行的方法!