the*_*ron 0 sqlite perl dbi create-table
我正在尝试创建一个包含两个表的数据库:客户和交易(一个客户可以做很多交易,一个交易只能由一个客户完成)。我正在使用以下 Perl 代码:
my $dbh = DBI->connect("dbi:SQLite:dbname=$RealBin/active.db","","")
    or die $DBI::errstr;
my @ddl = (
    "CREATE TABLE IF NOT EXISTS customer (
      id INTEGER PRIMARY KEY UNIQUE,
      id_1 INTEGER,
      id_2 INTEGER,
      name TEXT
    )",
    "CREATE TABLE IF NOT EXISTS transaction (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      customer_id INTEGER REFERENCES customer(id),
    )"
);
for my $sql (@ddl){
  $dbh->do($sql);
}
当我运行我的脚本时,我收到以下错误:
DBD::SQLite::db do failed: near "transaction": syntax error at
    t/oneToMany.t line 28 (#1)
DBD::SQLite::db do failed: near "transaction": syntax error at t/oneToMany.t line 28.
DBD::SQLite::db do failed: near "transaction": syntax error at
    t/oneToMany.t line 38 (#1)
第 28 行是这样的:
$dbh->do($sql);
你能告诉我我做错了什么吗?
transaction是一个SQLite 关键字,因此如果您想将其用作标识符,则必须将其引用(尽管为您的表选择一个不同的名称可能更好)。
你的外键约束也有点不对。customer_id 除了约束之外,您还需要指定一个列定义,并以FOREIGN KEY.
您的查询应如下所示:
CREATE TABLE IF NOT EXISTS "transaction" (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER,
    FOREIGN KEY (customer_id) REFERENCES customer(id)
)
此外,外键约束仅在您明确启用它们时才会强制执行:
SQLite 长期以来一直能够使用外键解析模式,但尚未强制执行约束。现在,您可以发出
foreign_keys编译指示以启用此功能并强制执行约束,最好在您连接到数据库并且您不在事务中时立即执行:Run Code Online (Sandbox Code Playgroud)$dbh->do("PRAGMA foreign_keys = ON");您可以随时通过关闭编译指示来明确禁用该功能:
Run Code Online (Sandbox Code Playgroud)$dbh->do("PRAGMA foreign_keys = OFF");在撰写本文时,SQLite 团队和我们默认禁用此功能,以确保向后兼容性,因为此功能可能会破坏您的应用程序,实际上为我们破坏了一些。如果您使用了带有外键约束的模式,但不太关心它们,并假设它们总是被 SQLite 忽略,请做好准备,并进行广泛的测试以确保您的应用程序在外键支持为默认启用。
全部一起:
use strict;
use warnings 'all';
use DBI;
my $dbh = DBI->connect('dbi:SQLite:dbname=foo.sqlite', '', '', {
    RaiseError => 1,
    PrintError => 0,
});
$dbh->do('PRAGMA foreign_keys = ON');
my @ddl = (
    'CREATE TABLE IF NOT EXISTS customer (
        id INTEGER PRIMARY KEY UNIQUE,
        id_1 INTEGER,
        id_2 INTEGER,
        name TEXT
    )',
    'CREATE TABLE IF NOT EXISTS "transaction" (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        customer_id INTEGER,
        FOREIGN KEY (customer_id) REFERENCES customer(id)
    )'
);
for my $sql (@ddl) {
    $dbh->do($sql);
}