sql - 我需要验证表中的数据,其中 1 列有多个值,但 1 个值只能通过唯一键出现在 1 行中

标签 sql validation db2 constraints ibm-midrange

示例: 由唯一名称和电子邮件地址键入的表,其中包含类型列 类型列可以有原始、工作、个人 您可以有多个工作和个人电子邮件,但只能有 1 个原始电子邮件 我正在使用 DB2 for i SQL,我想使用 UNIQUE 或 CHECK 约束来约束数据,但不确定如何处理此数据集。

Scott <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0172626e757541696e756c60686d2f626e6c" rel="noreferrer noopener nofollow">[email protected]</a> Original
Scott <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ea9989859e9eaa8d878b8386c4898587" rel="noreferrer noopener nofollow">[email protected]</a> Personal
Scott <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98ebfbf7ececd8f4f1eefdb6fbf7f5" rel="noreferrer noopener nofollow">[email protected]</a> Personal
Scott <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1c6f7f7368685c525e5f327f7371" rel="noreferrer noopener nofollow">[email protected]</a> Work
Scott <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="85f6e6eaf1f1c5c4c7c6abe6eae8" rel="noreferrer noopener nofollow">[email protected]</a> Work
Scott <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7506161a0101350c141d1a1a5b161a18" rel="noreferrer noopener nofollow">[email protected]</a> Original

我想确定,如果我已经将 hotmail 作为原始邮件,我就不能将 yahoo 作为原始邮件。 其余均有效。

如果我需要添加更多内容,请告诉我。

最佳答案

如果您有用于 IBM i 的 Db2,那么您可以创建一个 UNIQUE INDEX与相应的 WHERE 子句。

CREATE TABLE TEST_IND_EXPR 
(
  NAME VARCHAR (20) NOT NULL
, EMAIL VARCHAR (20) NOT NULL
, TYPE VARCHAR (20) NOT NULL
);

CREATE UNIQUE INDEX TEST_IND_EXPR1 ON TEST_IND_EXPR (NAME, EMAIL);
CREATE UNIQUE INDEX TEST_IND_EXPR2 ON TEST_IND_EXPR (NAME, TYPE) WHERE TYPE = 'Original';

INSERT INTO TEST_IND_EXPR VALUES ('Scott', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e79484889393a78f88938a868e8bc984888a" rel="noreferrer noopener nofollow">[email protected]</a>', 'Original');
INSERT INTO TEST_IND_EXPR VALUES ('Scott', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dfacbcb0abab9fb8b2beb6b3f1bcb0b2" rel="noreferrer noopener nofollow">[email protected]</a>', 'Personal');
INSERT INTO TEST_IND_EXPR VALUES ('Scott', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6013030f1414200c0916054e030f0d" rel="noreferrer noopener nofollow">[email protected]</a>', 'Personal');
INSERT INTO TEST_IND_EXPR VALUES ('Scott', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1261717d6666526b737a7d7d3c717d7f" rel="noreferrer noopener nofollow">[email protected]</a>', 'Original');

最后一个语句返回 SQL0803,因为该行违反了 TEST_IND_EXPR2 索引的唯一性。

关于sql - 我需要验证表中的数据,其中 1 列有多个值,但 1 个值只能通过唯一键出现在 1 行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73501979/

相关文章:

java - 使用 java 更新 oracle 中行的部分内容

DB2 外部表?

sql - 将多行插入 DB2 数据库

php - SQL, "WHERE IN"返回自动排序结果

mysql - 加速连接两个巨大表的查询

sql - 使用 "Like"函数比较同一个表中的 2 列

javascript - 当输入处于事件状态时,如何使用 angularjs 显示帮助消息?

java - 验证库设计模式选择

java - 我的验证全部合一

sql - DB2 字段值替换