【问题标题】:SQL - How to ignore insert of duplicate data (UNIQUE) if it's an empty string ('')?SQL - 如果它是空字符串(''),如何忽略插入重复数据(UNIQUE)?
【发布时间】:2012-11-03 05:35:57
【问题描述】:

我的表地籍:

cod_bolsa VARCHAR(7) PRIMARY KEY
nome VARCHAR(70) NOT NULL
endereco VARCHAR(100) NOT NULL
email VARCHAR(50) NOT NULL
telefone VARCHAR(13) NOT NULL
celular VARCHAR(14) NOT NULL
cpf VARCHAR(14) UNIQUE
cnpj VARCHAR(18) UNIQUE
rg VARCHAR(12) UNIQUE
datanasc VARCHAR(12) NOT NULL

查询:

INSERT INTO cadastro VALUES(
'000036',
'JULIO CESAR',
'AV. FRANZ VOEGELI, 300 - VILA YARA, SÃO PAULO/SP',
'julio.c@mail.com',
'(11)2345-6789',
'(11)99876-5432',
'987.654.321.00',
'',
'98.765.432-1',
'1972-5-12'
);


INSERT INTO cadastro VALUES(
'000125',
'JOAO MARIA',
'AV. FRANZ VOEGELI, 300 - VILA YARA, SÃO PAULO/SP',
'joao.m@mail.com',
'(11)2345-6789',
'(11)91676-1334',
'012.234.567-89',
'',
'01.234.345-8',
'1991-1-20'
);

MySQL 明明说

ERROR 1062 (23000): Duplicate entry '' for key 'cnpj'

如何避免?

【问题讨论】:

  • 你能用NULL代替空字符串吗? MySQL allows multiple rows with NULL in a unique index
  • 但是这些字段必须是唯一的。它们是识别号。
  • 然后使它们唯一可以为空,并将'' 改为null。空字符串 ('') ARE 字符串,并且具有唯一索引,您在该字段中不能有多个带有空字符串的记录。
  • INSERT IGNORE INTO ...
  • 谢谢,马丁史密斯。它适用于 NULL。 :-)

标签: mysql duplicates unique string


【解决方案1】:

“解决”这个问题的最明显方法当然是使字段不唯一。

但也许,您想要“如果违反唯一性约束,则使用其他内容更新前一个条目”之类的内容。

在这种情况下,您可能想要使用“ON DUPLICATE KEY UPDATE”或“REPLACE INTO”,它们是both explained here。

【讨论】:

  • INSERT INTO cadastro VALUES(...) ON DUPLICATE KEY set cnpj=null; .然后当你查询时:select coalesce(cnpj,'') from cadastro... .
  • 无法更新为其他内容。目的是注册新客户,但他们可以是个人或企业,因此 ID 号有三种可能的选择(个人两种,企业一种 (VATIN))。我会先插入一些人,所以显然他们不会有 VATIN。它必须为空或 NULL。 NULL 成功了,但我不知道我的 Java 应用程序是否能够将空字符串(通过 JTextField 插入数据时)转换为 NULL 值到数据库中。如果可能,那么我的问题得到了回答。 :-)
  • 考虑在代表您的应用程序逻辑的多个字段上应用唯一键。
  • 我有一个想法:把这个表的cnpj字段去掉,再做一个表,只为注册企业。或者,如果客户是企业,则仅用于注册cnpj字段的表;然后我可以使用 LEFT OUTER JOIN 从两个表中选择数据;左,因为如果“cnpj 表”中没有相应的 cod_bolsa 条目,它就不会显示在我的应用程序的 JTable 中。对吗?
  • 单独应用 UNIQUE 和同时应用到多个字段有什么区别?
【解决方案2】:

您的表在 [cnpj VARCHAR(18)] 上有一个 UNIQUE 约束; UNIQUE 约束保证 cnpj 列的唯一性,因此您不能插入 2 条具有相同 cnpj 值的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    相关资源
    最近更新 更多