【问题标题】:How to INSERT a field that contains an underscore and is also a foreign key如何插入包含下划线且也是外键的字段
【发布时间】:2014-07-24 04:45:51
【问题描述】:

如何在外键字段中插入包含下划线的数据? 例如。 这有效:

INSERT INTO [childTable] (1, 'ABC')

但这不起作用:

INSERT INTO [childTable] (1, '_ABC')

当它得到这个错误时:

"The INSERT statement conflicted with the FOREIGN KEY constraint "FK_childTable_parentTable". The conflict occurred in database "X", table "parentTable", column 'SomeField'".

我们有两个通过外键关联的表:

CREATE TABLE parentTable (
    Id int,
    SomeField [char] (4)
)

CREATE TABLE childTable (
    SomeField [char] (4)
)

ALTER TABLE childTable CONSTRAINT FK_childTable_parentTable
FOREIGN KEY SomeField
REFERENCES parentTable (SomeField)

并且 parentTable 肯定包含带有“_ABC”数据的记录。

如果我暂时移除或禁用外键约束,我可以插入记录OK,恢复外键OK,但是有没有办法转义下划线或其他更好的解决方案?

环境:SQL Server Management Studio 针对 Microsoft SQL Server 2008 R2 服务器和数据库,排序顺序设置为 Latin1_General_BIN。

【问题讨论】:

  • 为父表定义一个主键,并且具有 '_ABC' 的父表应该允许将该值插入到引用父表的子表中
  • 如果您删除下划线。工作正常吗?
  • 如果从父子记录中删除下划线 - 是的,它工作正常。
  • 语句 INSERT INTO [childTable] (1, '_ABC') 和 CREATE TABLE childTable (SomeField [char] (4)) 不一致(2 列与 1 列)。并且提供的语法也是错误的。看起来实际上您有不同的数据库模式。所以讨论当前的没有意义。附言从理论上讲,下划线可以有不同的二进制表示(例如对于 Unicode),因此它与您的二进制排序规则一起使用是错误的。

标签: sql-server


【解决方案1】:

简单地说 - 如果您遇到与外键冲突的错误 ABC 存在于您的父表中而 _ABC 不存在。它与下划线无关。

检查 _ABC 是否存在于您的父表中。如果它没有添加它 - 那么你插入到你的子表中就可以了。

【讨论】:

  • 检查所有数据;这绝对不是数据问题。我怀疑这与排序规则有关,但这不是决定性的,并且已经自行消失了,所以我很难过。
【解决方案2】:

当您有 INSERT 触发器时,可能会发生这种情况;得到错误的是TRIGGER。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多