列类型 INT、INTEGER、WHATEVER(您几乎可以指定任何列类型)几乎没有影响,它表示要存储在列中的内容。但是,它没有设置可以存储的数据的一种例外(将要讨论)的类型。简而言之,任何类型(除外)的数据都可以存储在任何列中(与定义的列类型无关)。
SQL 不区分存储类(null、integer、real、text、blob)以外的存储值,如果存储为 INTEGER,则它是一个整数,仅受其存储限制为最多 8字节(64 位有符号)。
例外是专门使用 INTEGER PRIMARY KEY 或 INTEGER 并将列设置为表级别的主键。存储的值必须是一个整数,否则会发生 DATATYPE MISMATCH。
- 根据 SQLite 版本 3 数据库中的任何列(INTEGER PRIMARY KEY 列除外)都可用于存储任何存储类的值。 (也在2.存储类和数据类型)
所以最终我的问题是,将主键的数据类型声明为 TINYINT SMALLINT、MEDIUMINT、BIGINT、UNSIGNED BIG INT、INT2、INT8 之一会有什么不同吗?
不适用于列出的类型 (TINYINT ....),因为所有类型都包含 INT 它们将具有 INTEGER 的类型关联,并且该列将 NOT 成为 rowid 的别名 列。
如果您在列表中包含 INTEGER,则 YES 会有所不同,因为该列将成为 rowid 列的别名(即它是 INTEGER PRIMARY KEY )。该列也将限制为整数值(使用其他列出类型的列将不限制为整数值)。
您可能希望参考Datatypes in SQLite
以下 SQL 演示了上述部分内容:-
DROP TABLE IF EXISTS example;
CREATE TABLE IF NOT EXISTS example (
rowid_alias_must_be_unique_integer INTEGER PRIMARY KEY,-- INTEGER PRIMARY KEY makes the column an alias of the rowid
col_text TEXT,col_integer INTEGER,col_real REAL,col_BLOB BLOB,col_anyother this_is_a_stupid_column_type -- will have a type affinitiy of NUMERIC
);
/* INSERTS first row with a negative rowid */
INSERT INTO example VALUES (-100,'MY TEXT',340000,34.5678,x'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff',100);
/* All subsequent inserts use the generated rowid */
/* the same value is inserted into all the other columns */
INSERT INTO example (col_text,col_integer,col_real,col_blob,col_anyother) VALUES
('MY TEXT','MY TEXT'),(100,100,100),(34.5678,34.5678),(x'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff',x'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff')
;
SELECT
*,rowid,typeof(rowid_alias_must_be_unique_integer),typeof(col_text),typeof(col_integer),typeof(col_real),typeof(col_blob),typeof(col_anyother)
FROM example
;
/* WILL FAIL as rowid alias is not an integer */
INSERT INTO example VALUES('a','a','a');
DROP TABLE IF EXISTS example;
第一个 SELECT 的结果将是:-
- 请注意,blob 是根据工具(Navicat for SQLite)处理 blob 显示的方式来处理/显示的。
最后一个 INSERT 失败,因为插入到 rowid 别名中的值不是整数值,例如:-
/* WILL FAIL as rowid alias is not an integer */
INSERT INTO example VALUES('a','a')
> datatype mismatch
> Time: 0s
- 请注意,答案并未涉及列亲和性如何影响数据提取的复杂性。
本文链接:https://www.f2er.com/13986.html