[英]sqlite3 foreign keys on PDO
我使用PDO连接到sqlite3,但是由于某些原因,我无法使外键正常工作。 根据文档,此“ PRAGMA short_column_names = 1”应启用该功能。 我这样做:
$con = new PDO('sqlite:z:/testing.db');
$res = $con->exec('PRAGMA foreign_keys=ON');
var_dump($res);die();
返回0。我尝试使用外键创建实际的表,但它不起作用。 对SQLite3类的直接请求有效:
$con = new SQLite3('z:/testing.db');
$con->exec('PRAGMA foreign_keys = ON;');
var_dump($con->query('PRAGMA foreign_keys;')->fetchArray());
此reutrns array(2){[0] => int(1)[“ foreign_keys”] => int(1)}
根据SQLite3 :: version(),我有sqlite版本3.7.7.1。 我的PHP版本是5.3.18,可在Windows上运行。
请帮助我使其与PDO一起运行。 谢谢!
我不知道PRAGMA short_column_names=1;
应该与PDO一起发布,以便外键约束与SQLite一起使用。 但是,您应该发出PRAGMA foreign_keys = ON;
以及PDO。
试试看:
<?php
// SQL for creating database structure
$databaseSql = <<<SQL
CREATE TABLE `user` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT NOT NULL,
UNIQUE( `name` )
);
CREATE TABLE `userProfile` (
`userId` INTEGER NOT NULL CONSTRAINT `userProfile_userId` REFERENCES `user`( `id` ) ON UPDATE CASCADE ON DELETE CASCADE,
`image` TEXT NOT NULL
);
SQL;
// SQL for inserting dummy data
$dataSql = <<<SQL
INSERT INTO `user` VALUES( 1, "John" );
INSERT INTO `user` VALUES( 2, "Mary" );
INSERT INTO `user` VALUES( 3, "Joe" );
INSERT INTO `userProfile` VALUES( 1, "/images/john.jpg" );
INSERT INTO `userProfile` VALUES( 2, "/images/mary.jpg" );
INSERT INTO `userProfile` VALUES( 3, "/images/joe.jpg" );
SQL;
// create a temporary SQLite instance in memory
$db = new PDO( 'sqlite::memory:', null, null, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
) );
// activate use of foreign key constraints
$db->exec( 'PRAGMA foreign_keys = ON;' );
// create database
$db->exec( $databaseSql );
// insert dummy data
$db->exec( $dataSql );
// should dump 3 records
var_dump( $db->query( 'SELECT * FROM `userProfile`;' )->fetchAll() );
// delete 1 user, cascade deleting 1 userProfile as well
$db->exec( 'DELETE FROM `user` WHERE `id` = 1;' );
// should dump 2 records
var_dump( $db->query( 'SELECT * FROM `userProfile`;' )->fetchAll() );
它应导致以下结果:
array(3) {
[0]=>
array(2) {
["userId"]=>
string(1) "1"
["image"]=>
string(16) "/images/john.jpg"
}
[1]=>
array(2) {
["userId"]=>
string(1) "2"
["image"]=>
string(16) "/images/mary.jpg"
}
[2]=>
array(2) {
["userId"]=>
string(1) "3"
["image"]=>
string(15) "/images/joe.jpg"
}
}
array(2) {
[0]=>
array(2) {
["userId"]=>
string(1) "2"
["image"]=>
string(16) "/images/mary.jpg"
}
[1]=>
array(2) {
["userId"]=>
string(1) "3"
["image"]=>
string(15) "/images/joe.jpg"
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.