【问题标题】:android.database.sqlite.SQLiteException: near "ON": syntax error (code 1)android.database.sqlite.SQLiteException:接近“ON”:语法错误(代码 1)
【发布时间】:2014-09-26 11:56:14
【问题描述】:

这是我在服务器上用来创建表的 MySQL 代码...

CREATE TABLE brand_names (
    id int(7) unsigned NOT NULL AUTO_INCREMENT,
    brand_name varchar(255) NOT NULL,
    parent_company_id int(7) NOT NULL DEFAULT '0',
    last_modified_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY brand_name (brand_name),
    FULLTEXT KEY name (brand_name)
) ENGINE=MyISAM AUTO_INCREMENT=225 DEFAULT CHARSET=latin1

我正在尝试使用...在 Android 中复制同一张表

CREATE TABLE brand_names (
    _id integer PRIMARY KEY AUTOINCREMENT,
    brand_name text NOT NULL,
    parent_company_id integer NOT NULL DEFAULT '0',
    last_modified_on datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE SET DEFAULT
)

但是,我遇到了这个异常...

android.database.sqlite.SQLiteException: near "ON": syntax error (code 1): , while compiling: CREATE TABLE brand_names (_id integer PRIMARY KEY AUTOINCREMENT, brand_name text NOT NULL, parent_company_id integer NOT NULL DEFAULT '0', last_modified_on datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE SET DEFAULT);

所以ON 部分似乎有问题。 (注意 - 我试图用 ON 子句实现的所有目的是让它在更新行时,last_modified_on 日期时间将自动设置为当前时间。

我看过这个SQLite page,看起来我的语法是正确的,但显然有些地方有问题,所以我有点难过。谁能帮忙解决?

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    正确的是,

    CREATE TABLE brand_names (
        _id integer PRIMARY KEY AUTOINCREMENT,
        brand_name text NOT NULL,
        parent_company_id integer NOT NULL DEFAULT '0',
        last_modified_on datetime NOT NULL DEFAULT CURRENT_TIMESTAMP);
    

    您最后使用的是 ON UPDATE SET DEFAULT,这是错误的语法。

    last_modified_on 日期时间将使用 DEFAULT CURRENT_TIMESTAMP 自动设置为当前时间。

    你从SQLite doc看到的和你想要达到的完全不同。

    假设您有一个 id 为 parent_company_id 的父表 -

    CREATE TABLE brand_names(_id integer PRIMARY KEY AUTOINCREMENT,
    brand_name text NOT NULL, parent_company_id integer NOT NULL DEFAULT '0', 
    last_modified_on datetime NOT NULL REFERENCES parent(parent_company_id) 
    ON UPDATE SET DEFAULT);
    

    这将更新父记录的 parent_company_id(外键约束的父键)列,而不会破坏 parentbrand_names 两个表之间的引用完整性。

    只有在修改了父键的值以使新的父键值不等于旧的父键值时才会执行ON UPDATE 操作。因此,这用于配置在修改现有行的父键值时发生的操作(ON UPDATE)。它们与 SQLite 数据库中的每个外键相关联。

    【讨论】:

    • ... ON UPDATE 需要 SQLite 中的触发器。
    • @CL。 - 确实!忘了提一下,它被用作自动更新行而不破坏参照完整性的触发器。谢谢!
    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2016-06-18
    • 2020-11-29
    相关资源
    最近更新 更多