Mysql唯一约束> 16列

时间:2016-05-16 23:02:51

标签: mysql constraints unique

我想尽可能多地使用规范化。但是,只是无法绕过这一个。

假设我有这样的财务数据:

分类帐#| dimension1 | dimension2 | DIMENSION3

4000 | 100 | 200 | 300

5113 | 100 | 298 | 300

我需要确保这4列的每个组合都是唯一的。我知道唯一约束,所以我在所有提到的列上都添加了“唯一”。

但是......如果维度列的数量必须为25,那么将会有25个维度列而不是提到的3个列?我将如何使用唯一约束?我知道一个约束只能容纳16列或3072个字节,不再存在。

我在考虑使用某种哈希值,但还没弄清楚如何做到这一点。

任何人都可以通过提供想法/信息/示例来帮助我吗?

如果在没有独特约束的情况下实现这一目标存在完全不同的想法,我会全神贯注地听到它!

1 个答案:

答案 0 :(得分:0)

选项1:

CREATE TABLE bigboy (
  ledger_sub1 int unsigned not null COMMENT 'foreign key me...',
  ledger_sub2 int unsigned not null COMMENT 'forgein key me...'
  PRIMARY KEY (ledger_sub1,ledger_sub2)
)

CREATE TABLE bigboy_sub1 {
 ledger int unsigned auto_increment,
 dim01 int unsigned not null,
 ...
 dim15 int unsigned not null,
 PRIMARY KEY (ledger),
 UNIQUE KEY uk1 (dim01..dim15)
)

CREATE TABLE bigboy_sub2 {
 ledger int unsigned auto_increment,
 dim16 int unsigned not null,
 ...
 dim30 int unsigned not null,
 PRIMARY KEY (ledger),
 UNIQUE KEY uk1 (dim16..dim30)
)

ledger_sub1 = INSERT IGNORE INTO bigboy_sub1(dim01..dim15) and return ledger;
ledger_sub2 = INSERT IGNORE INTO bigboy_sub2(dim16..dim30) and return ledger;
its_unique = INSERT IGNORE INTO bigboy(ledger_sub1,ledger_sub2);

选项2:

CREATE TABLE bigboy {
 ledger int unsigned auto_increment,
 dim01 int unsigned not null,
 ...
 dim30 int unsigned not null,
 bigboy_uniq VARCHAR(301) not null,
 PRIMARY KEY (ledger),
 UNIQUE KEY uk1 (bigboy_uniq)
);
where bigboy_uniq = concatenation of LPAD'ed dim01..dim30

2选项:

CREATE TABLE bigboy {
 ledger int unsigned auto_increment,
 dim01 int unsigned not null,
 ...
 dim30 int unsigned not null,
 fingers_crossed VARCHAR(32) not null,
 PRIMARY KEY (ledger),
 UNIQUE KEY uk1 (fingers_crossed)
);
where fingers_crossed = md5 of LPAD'ed dim01..dim30 string

(免责声明 - 我不会单独使用任何这些,除非黑客攻击)