INSERT + SELECT 相似字段的数据类型不匹配

INSERT + SELECT data type mismatch on similar fields

我是 运行 以下 SQLite 变通方法,用于将主键添加到没有主键的 table。

上出现数据类型不匹配
INSERT INTO cities 
SELECT id, name FROM old_cities;

但是,字段的类型完全相同。是否有可能是由于 运行 来自 DbBrowser 的 SQLite 查询?

CREATE table cities (
    id INTEGER NOT NULL,
    name TEXT NOT NULL
);

INSERT INTO cities (id, name)
VALUES ('pan', 'doul');

END TRANSACTION;
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;

ALTER TABLE cities RENAME TO old_cities;

--CREATE TABLE cities (
--   id INTEGER NOT NULL PRIMARY KEY,
--   name TEXT NOT NULL
--);


CREATE TABLE cities (
   id INTEGER NOT NULL,
   name TEXT NOT NULL,
   PRIMARY KEY (id)
);

SELECT * FROM old_cities;

INSERT INTO cities 
SELECT id, name FROM old_cities;

DROP TABLE old_cities;

COMMIT;

您已将 table cities 的列 id 定义为 INTEGER,但是:

INSERT INTO cities (id, name) VALUES ('pan', 'doul');

您插入字符串 'pan' 作为 id
SQLite 在这种情况下不做任何类型检查并允许它。

您是要插入 2 行,每行的名称为 'pan''doul'
如果是这样,你应该这样做:

INSERT INTO cities (id, name) VALUES (1, 'pan'), (2, 'doul'); 

稍后您将 table cities 重命名为 old_cities 并重新创建 cities 但您做了一些不同的事情:您将 id 定义为 INTEGERPRIMARY KEY.
这个定义是唯一一个在 SQLite 中强制进行类型检查的定义。

因此,当您尝试插入从 old_citiescities 的行时,您会收到错误消息,因为 id 列中不允许 'pan',因为它是现在定义。