在向表中添加主键后,我发现了一些非常奇怪的行为。在创建密钥之前,表中有6,672行。创建密钥后,有103.但是如果在空表上创建密钥,那么添加相同的数据就有6,672行。是的,用于制作主键的所有值都是唯一的。 我跑的代码如下。
表格是'WC':
CREATE TABLE `wc` (
`gvkey` bigint(20) NOT NULL,
`date_fin` date NOT NULL,
`wc` double DEFAULT NULL,
`wc_less_debt_st` double DEFAULT NULL,
`curr_liab_x` double DEFAULT NULL,
`wc_adj` double DEFAULT NULL,
`wc_adj_v2` double DEFAULT NULL,
PRIMARY KEY (`gvkey`,`date_fin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建表后,运行以下代码:
ALTER TABLE wc
DROP PRIMARY KEY;
DELETE FROM wc;
INSERT INTO wc (date_fin, gvkey)
SELECT DISTINCT u.udate, g.gvkey
FROM gvkey as g INNER JOIN udate as u
WHERE g.flag = TRUE;
ALTER TABLE wc
ADD PRIMARY KEY `gvkey-date` (gvkey asc, date_fin asc);
测试表的大小:
SELECT COUNT(gvkey) FROM (SELECT gvkey FROM wc GROUP BY gvkey) AS x;
如果在添加主键之前运行测试,则结果为6,672。在创建密钥后运行时,结果为103.如果我然后移动呼叫
ALTER TABLE wc
ADD PRIMARY KEY `gvkey-date` (gvkey asc, date_fin asc);
到delete from wc
之后,然后运行INSERT
然后它工作正常,表格中有6,672行。
我之前遇到过一些问题,即将主键添加到已经填充了数据的表中但是从来没有这么明显。
这是否已知行为,将主键添加到已填充的表是不好的做法?我按此顺序执行此操作的动机(填充然后创建PK)是因为我认为插入在没有主键的情况下运行得更快。虽然这个表没关系,但我正在使用一些记录超过3m的表。我对数据库管理还很陌生,所以任何建议或解释都将不胜感激。我还没有在其他地方找到任何提及。
谢谢,