这两个sql脚本有什么区别?

时间:2017-08-31 14:47:48

标签: mysql sqlite

我在sqlite中使用这个

CREATE TABLE IF NOT EXISTS developer(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,skill TEXT,yearsOfExperience INTEGER);
INSERT INTO developer(name, skill, yearsOfExperience) VALUES ('Simon', 'Ionic', '4');
INSERT INTO developer(name, skill, yearsOfExperience) VALUES ('Jorge', 'Firebase', '2');
INSERT INTO developer(name, skill, yearsOfExperience) VALUES ('Max', 'Startup', '5');

虽然这是来自导出的mysql db

CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(11) NOT NULL,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(300) DEFAULT NULL,
  `first_name` varchar(200) DEFAULT NULL,
  `last_name` varchar(200) NOT NULL,
  `email` varchar(300) DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

他们都是sql,但为什么导入时sqlite不接受第二个? 我希望有人可以告诉我有什么区别所以我可以将第二个sql的副本复制成sqlite可读

2 个答案:

答案 0 :(得分:0)

mysql不是sqllite你必须更新你的第二个sql查询,如下所示,以便被sqllite接受(因为sqllite中不存在类型时间戳):

CREATE TABLE IF NOT EXISTS `user` (
`user_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`username` varchar(50),
`password` varchar(300) ,
`first_name` varchar(200),
`last_name` varchar(200) NOT NULL,
`email` varchar(300),
`created` TEXT NOT NULL
);

答案 1 :(得分:0)

您可以将第二个表的当前MySQL CREATE TABLE语句重构为:

CREATE TABLE IF NOT EXISTS user (
    user_id INTEGER NOT NULL,
    username TEXT,
    password BLOB,
    first_name TEXT,
    last_name TEXT,
    email TEXT,
    created INTEGER
)

SQLite的语法不支持指定引擎(例如InnoDB)。此外,没有varchar列类型,但有TEXTINTEGER。默认情况下,列的值为NULL,因此如果NULL是您想要的默认值,则无需明确指定它。 SQLite遵循SQL标准来转义列和表名,并使用双引号而不是反引号。所以我从所有列名中删除了反引号。

最后,我选择将您的created时间戳设为INTEGER。您可以存储自纪元以来的秒数,即UNIX时间戳。另一种方法是将时间戳存储为TEXT,但这可能更难处理,具体取决于您打算做什么。