当我从第一个表中删除C#中带有ExecuteNonQuery()
的主键时,它不会影响第二个表。
但是当我对SQLiteStudio做同样的事情时,它会影响第二个表。
这是我的SQLite代码:
CREATE TABLE Zdravila(
ID INTEGER PRIMARY KEY,
NACIONALNA_SIFRA INTEGER UNIQUE NOT NULL,
IME_ZDRAVILA TEXT,
POIMENOVANJE_IZDELKA TEXT NOT NULL,
SIFRA_REZIM_IZDAJE INTEGER NOT NULL,
ATC_OZNAKA TEXT NOT NULL,
NAZIV_POTI_UPORABE TEXT NOT NULL,
FOREIGN KEY(NACIONALNA_SIFRA) REFERENCES LastnostiZdravila(NACIONALNA_SIFRA) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE LastnostiZdravila(
NACIONALNA_SIFRA INTEGER PRIMARY KEY,
NAZIV_FARMACEVTSKE_OBLIKE TEXT NOT NULL,
KOLICINA_OSNOVNE_ENOTE INTEGER NOT NULL CHECK (KOLICINA_OSNOVNE_ENOTE > 0),
OZNAKA_OSNOVNE_ENOTE TEXT NOT NULL,
PAKIRANJE TEXT NOT NULL,
SIFRA_IMETNIKA_DOVOLJENJA TEXT NOT NULL
);
PRAGMA foreign_keys = ON;
我的C#代码:
SQLiteConnection conn = new SQLiteConnection(poveziZBazo);
SQLiteCommand sqlQuery = new SQLiteCommand(sql);
sqlQuery.Connection = conn;
conn.Open();
SQLiteTransaction trans;
trans = conn.BeginTransaction();
sqlQuery.CommandText = sql;
j = sqlQuery.ExecuteNonQuery();
trans.Commit();
sqlQuery.Dispose();
conn.Close();
我的查询:
"DELETE FROM LastnostiZdravila WHERE NACIONALNA_SIFRA = " + "'" + NacionalnaSifraBrisanje + "'" + ";";
(我查看NacionalnaSifraBrisanje的sql命令)
答案 0 :(得分:2)
根据http://sqlite.org/pragma.html#pragma_foreign_keys:
从SQLite版本3.6.19开始,外键强制的默认设置为OFF。但是,这可能会在SQLite的未来版本中发生变化。
至于现在,这仍然是默认的。
CL已告诉您foreign_keys
设置为"每个连接" - 这意味着每次与SQLite数据库建立新连接时,foreign_keys
pragma都会设置为默认值,即false
。
您需要做的是在每次与SQLite建立连接后执行PRAGMA foreign_keys = 1;
,因此您的C#应用程序可以使用外键。
这实际上是SQLiteStudio内部所做的事情以及它在那里工作的原因。