在将主键添加到表后,我刚刚发现了一些非常奇怪的行为。在创建键之前,表中有 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
then 它工作正常,导致表中有 6,672 行。
我以前遇到过一些问题,将主键添加到已经填充了数据的表中,但从来没有这么明显过。
这是已知的行为吗?将主键添加到填充的表中是否是不好的做法?我按此顺序执行此操作(填充然后创建 PK)的动机是因为我认为插入会在没有主键的情况下运行得更快。虽然这张表无关紧要,但我正在处理一些记录超过 3m 的表。我对数据库管理相当陌生,因此任何建议或解释都将不胜感激。我在其他任何地方都没有发现任何提及这一点。
谢谢,