1

在将主键添加到表后,我刚刚发现了一些非常奇怪的行为。在创建键之前,表中有 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 的表。我对数据库管理相当陌生,因此任何建议或解释都将不胜感激。我在其他任何地方都没有发现任何提及这一点。

谢谢,

4

0 回答 0