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
定义为 INTEGER
和 PRIMARY KEY
.
这个定义是唯一一个在 SQLite 中强制进行类型检查的定义。
因此,当您尝试插入从 old_cities
到 cities
的行时,您会收到错误消息,因为 id
列中不允许 'pan'
,因为它是现在定义。
我是 运行 以下 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
定义为 INTEGER
和 PRIMARY KEY
.
这个定义是唯一一个在 SQLite 中强制进行类型检查的定义。
因此,当您尝试插入从 old_cities
到 cities
的行时,您会收到错误消息,因为 id
列中不允许 'pan'
,因为它是现在定义。