避免重复导入更新的 excel-sheets。唯一索引最多只能容纳 10 个字段
Avoid duplicates on import of updated excel-sheets. Unique-Index can only hold 10 fields max
我面临以下情况:
我导入一个Excel-Sheet,然后修改了一些列(例如"comments")
一段时间后,我会收到更新的 Excel-Sheet,其中包含旧 Excel-sheet 和新记录的记录。
我不想导入数据库中已经存在的记录。
循序渐进:
初始Excel-sheet
col1 col2 comments
A A
A B
导入后,部分字段会被操纵
col1 col2 comments
A A looks good
A B fine with me
然后我收到 excel sheet 更新
col1 col2 comments
A A
A B
A C
在这个更新步骤之后,数据库应该看起来像
col1 col2 comments
A A looks good
A B fine with me
A C
我打算简单地在所有不会被操纵的字段上创建一个唯一索引,因此只会导入新记录。 (比如
ALTER TABLE tbl ADD CONSRAINT unique_key UNIQUE (col1,col2)
我现在的问题是 Access 以某种方式只允许最大的复合索引。 10 个字段。我的 table 都有大约 11-20 列...
我也许可以将更新后的 xls 导入临时文件。 table,然后 s.th 喜欢
INSERT INTO tbl_old SELECT col1,col2, "" FROM tbl_new WHERE (col1,col2) NOT IN (SELECT col1,col2 FROM tbl_old UNION SELECT col1,col2 FROM tbl_new)
但我想知道是否有更直接的方法...
有什么解决办法吗?
考虑到您将使用 SQL 方法:
INSERT INTO table_old (col1, col2)
SELECT col1, col2 FROM table_new
EXCEPT
SELECT col1, col2 FROM table_old
:)
它会在 comments
列中插入 null
。使用这个:
INSERT INTO table_old
SELECT * FROM table_new
EXCEPT
SELECT * FROM table_old
避免空值。此外,两个 tables 必须具有相同数量的列。对于 Oracle,使用 minus
而不是 except
。等效的 SQL 查询将使用 LEFT OUTER JOIN
.
进行
INSERT INTO table_old (col1 , col2)
SELECT N.col1, N.col2
FROM table_new N
LEFT OUTER JOIN table_old O ON O.col2 = N.col2
WHERE O.col2 IS NULL
这也将为 comments
列提供 null
值,因为我们只插入 col1 和 col2。所有插入都在提供的 table 个示例上进行了测试。
我只想将 PK ID
列放在那些 table 中。
尝试 EXISTS 条件:
INSERT INTO tbl_old (col1, col2, comments)
SELECT col1, col2, Null
FROM tbl_new
WHERE NOT EXISTS (SELECT col1, col2 FROM tbl_old WHERE tbl_old.col1 = tbl_new.col1 AND tbl_old.col2 = tbl_new.col2);
我面临以下情况:
我导入一个Excel-Sheet,然后修改了一些列(例如"comments") 一段时间后,我会收到更新的 Excel-Sheet,其中包含旧 Excel-sheet 和新记录的记录。 我不想导入数据库中已经存在的记录。
循序渐进:
初始Excel-sheet
col1 col2 comments
A A
A B
导入后,部分字段会被操纵
col1 col2 comments
A A looks good
A B fine with me
然后我收到 excel sheet 更新
col1 col2 comments
A A
A B
A C
在这个更新步骤之后,数据库应该看起来像
col1 col2 comments
A A looks good
A B fine with me
A C
我打算简单地在所有不会被操纵的字段上创建一个唯一索引,因此只会导入新记录。 (比如
ALTER TABLE tbl ADD CONSRAINT unique_key UNIQUE (col1,col2)
我现在的问题是 Access 以某种方式只允许最大的复合索引。 10 个字段。我的 table 都有大约 11-20 列...
我也许可以将更新后的 xls 导入临时文件。 table,然后 s.th 喜欢
INSERT INTO tbl_old SELECT col1,col2, "" FROM tbl_new WHERE (col1,col2) NOT IN (SELECT col1,col2 FROM tbl_old UNION SELECT col1,col2 FROM tbl_new)
但我想知道是否有更直接的方法...
有什么解决办法吗?
考虑到您将使用 SQL 方法:
INSERT INTO table_old (col1, col2)
SELECT col1, col2 FROM table_new
EXCEPT
SELECT col1, col2 FROM table_old
:)
它会在 comments
列中插入 null
。使用这个:
INSERT INTO table_old
SELECT * FROM table_new
EXCEPT
SELECT * FROM table_old
避免空值。此外,两个 tables 必须具有相同数量的列。对于 Oracle,使用 minus
而不是 except
。等效的 SQL 查询将使用 LEFT OUTER JOIN
.
INSERT INTO table_old (col1 , col2)
SELECT N.col1, N.col2
FROM table_new N
LEFT OUTER JOIN table_old O ON O.col2 = N.col2
WHERE O.col2 IS NULL
这也将为 comments
列提供 null
值,因为我们只插入 col1 和 col2。所有插入都在提供的 table 个示例上进行了测试。
我只想将 PK ID
列放在那些 table 中。
尝试 EXISTS 条件:
INSERT INTO tbl_old (col1, col2, comments)
SELECT col1, col2, Null
FROM tbl_new
WHERE NOT EXISTS (SELECT col1, col2 FROM tbl_old WHERE tbl_old.col1 = tbl_new.col1 AND tbl_old.col2 = tbl_new.col2);