我正在与Invoice相关的项目中工作,现在我遇到了DB索引大小或与index
相关的问题。
索引:
Keyname: invoice_number_company_unique
Type: BTREE
Unique: Yes
Packed: No
Column: invoice_number_prefix, invoice_number, company_id
Cardinality: 256, 768, 768
Collation: A, A, A
Null: Yes, Yes, No
表名:invoices
表格结构:
CREATE TABLE IF NOT EXISTS `invoices` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`invoice_number_prefix` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`invoice_number` int(12) unsigned DEFAULT NULL,
`company_id` int(11) unsigned NOT NULL,
`amount` decimal(13,2) NOT NULL DEFAULT '0.00' COMMENT 'Invoice Total'
PRIMARY KEY (`id`),
UNIQUE KEY `invoice_number_company_unique`
(`invoice_number_prefix`,`invoice_number`,`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
数据插入到:invoice_number_company_unique = invo settings-4294967295-6
在尝试执行下一张发票时invoice_number_company_unique = invo settings-4294967296-6
:它开始显示数据库错误,如下所示:
为'invoice_number_company_unique'重复输入'invo settings-4294967295-6'
我认为它与索引的大小有关。因为当我将invo settings-4294967295-6
更改为invo sett-4294967295-6
时,它成功运作了。我在DB中直接尝试了这个。
使用:invo settings-4294967295-6
数据库错误
使用:invo sett-4294967295-6
成功
任何人都可以知道吗?请尽力帮助我?
答案 0 :(得分:1)
我想我有理由&回答我所面临的问题&在这里,我与大家分享。
无论指定的长度如何,INT
始终为4个字节。
TINYINT = 1 byte (8 bit)
SMALLINT = 2 bytes (16 bit)
MEDIUMINT = 3 bytes (24 bit)
INT = 4 bytes (32 bit)
BIGINT = 8 bytes (64 bit).
长度只指定使用mysql命令行客户端选择数据时要显示的字符数。
最大值为2147483647 (Signed)
或4294967295 (Unsigned)
。
您可以看到最大范围为4294967295
,如果您查看我的错误,则清楚我的发票号码达到了最大值。 invoice
表中字段类型为int(11)
的限制。
我已将类型更改为bigint
&问题已解决。
我的项目&中不接受将int
更改为bigint
。所以我必须将发票号码重置为一个小得多的数字&修复了DB中的错误。
答案 1 :(得分:0)
UNIQUE KEY `invoice_number_company_unique`
(`invoice_number_prefix`,`invoice_number`,`company_id`)
由于串联可能会导致您的索引太大,是否会使引擎认为两个不同的条目重复?您可以尝试限制invoice_number_prefix中的字符标记,看看它是否有效:
删除invoice_number_company_unique
索引并再次创建它,将前缀限制为10个字符,如下所示:
CREATE INDEX invoice_number_company_unique ON invoices
(invoice_number_prefix(10),invoice_number,company_id)