标签: sqlite

为sqlite数据库创建阻止插入的触发器

我正在尝试触发代表学校的sqlite数据库.我有一个名为Administrators的表,具有此模式:

CREATE TABLE Administrators(
ssn INT CHECK(ssn > 100000000),
lName CHAR(20),
fName CHAR(10),
gender CHAR(1) CHECK(gender IN('F','M')),
dob DATE,
address CHAR(100),
phone INT CHECK(phone > 1000000000),
role CHAR(20) CHECK(role IN('Principal','Vice Principal','Dean')),
PRIMARY KEY(ssn)
);
Run Code Online (Sandbox Code Playgroud)

我想确保只有一个校长.我已经尝试了所有我能想到的东西,并且在触发器的不同位置不断出现错误.我试过的最后一个说"IF"附近有一个错误

sqlite> CREATE TRIGGER onePres
   ...> BEFORE INSERT ON Administrators
   ...> BEGIN
   ...> IF (EXISTS (SELECT * FROM Administration WHERE role = 'Principal'))
   ...> BEGIN
   ...> ROLLBACK TRANSACTION;
   ...> RETURN
   ...> END;
   ...> END;
Run Code Online (Sandbox Code Playgroud)

有谁能帮我弄清楚我做错了什么?谢谢!

sql database sqlite triggers

14
推荐指数
1
解决办法
8151
查看次数

sqlite无法打开数据库文件是加密的还是不是数据库?

我正在使用sqlite数据库的Windows应用程序.net 2.0,我的连接字符串保持在app.config之类

<connectionStrings>
<add name="SQLiteDB" 
     connectionString="Data Source=|DataDirectory|database.s3db;version=3;password=mypassword;" 
     providerName="System.Data.Sqlite"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

在连接字符串中,我已将密码定义为"mypassword",如果我删除此密码一切正常,但是当我使用密码子句时,它给出了connection.open()语法错误

File opened that is not a database file
file is encrypted or is not a database
Run Code Online (Sandbox Code Playgroud)

我在网上搜索并发现了一些版本问题,但我只使用版本3,因为我在连接字符串中说明我也尝试删除"版本= 3"但问题仍然是相同的.

我是第一次这样做,它的解决方案是什么?

c# sqlite visual-studio-2010 winforms

14
推荐指数
3
解决办法
3万
查看次数

Android(分布式应用程序)主键策略

我将实现具有多个移动客户端和基于Web的服务器应用程序的分布式应用程序.因此,允许每个客户端和服务器生成表条目.因此,我需要所有参与者的唯一主键,我希望能够离线生成密钥.

生成在分布式环境中使用的主键的最佳方法是什么?对于类似的问题,请参阅使用SQLite和Azure SQL数据库作为中央存储的在线/离线多客户端移动应用程序的最佳主键策略是什么?

我知道UUID密钥生成对于这种情况来说是一个很好的方法,但是我想坚持使用名称为_id的密钥并按照Android平台的建议输入.

我不希望具有设备(也是服务器是设备)id和本地ID 的复合 ID.这种方法无论如何都不会很好,因为服务器应该能够为某个客户端生成条目.在这种情况下,我还必须在服务器上使用设备ID.

因此,我目前最喜欢的是使用数据类型long构建我的密钥(我之前在另一个项目中执行了此操作).我想我将使用高/低方法(例如参见这里的Hi/Lo算法是什么?)并且有一个键包括:

  • 从服务器生成的客户端ID(例如~28位)
  • 在客户端递增的低值(例如~4位),永不持久
  • 在客户端递增的高值(例如~32位)仅在客户端上保留

必须在首次启动移动应用程序时从服务器获取客户端ID.所以第一次启动需要网络连接.这可能是这种方法的缺点.在设备上拥有客户端ID时,我可以在没有网络连接的情况下生成密钥.

通常,高id是数据库的唯一值.当用户卸载应用程序并再次安装它时,我必须将他视为新客户端,并且必须给他一个新的客户端ID.否则我将不得不在服务器上保存当前的高ID,以便能够在丢失或重新安装时恢复它 - 不值得努力.

在Android上获取高ID的最佳方法是什么?自动增量键不是解决方案.我需要类似发电机功能的东西.它必须在自己的事务中执行(而不是"用户"事务).有没有人在Android上体验过这种方法,有人能指出我正确的方向吗?(我只找到了这个答案).

您在多客户端应用程序(在线和离线)中使用了哪些关键策略?

sqlite android database-design

14
推荐指数
1
解决办法
1934
查看次数

sqlite用户/密码安全

我正在开发一个简单的网站,我正在尝试一个sqlite数据库.与MySQL相比,当您连接到数据库时,您没有说和用户/密码,而使用MySQL则可以.

所以,任何人都可以访问它.保存敏感信息不是一个安全漏洞吗?

甚至隐藏你的db.sqlite,从第三方程序/ web查询此数据库获取信息应该不难.

谢谢你的时间.

sqlite security

14
推荐指数
2
解决办法
2万
查看次数

为什么TINYINT(1)用作布尔值但INT(1)不用?

为什么TINYINT(1)作为布尔值工作?我理解官方文档的方式,(1)应该意味着它的显示宽度为1,所以如果我存储56它,我认为它应该打印5.但由于某种原因,它总是打印10.

另一种情况是如果我存储56在一个INT(1),然后它打印56(至少根据SQLFiddle).这里发生了什么?

mysql sql database sqlite phpmyadmin

14
推荐指数
3
解决办法
2万
查看次数

python sqlite插入命名参数或null

我正在尝试使用命名参数将字典中的数据插入数据库.我有一个简单的SQL语句,例如

SQL = "INSERT INTO status (location, arrival, departure) VALUES (:location, :arrival,:departure)"
dict = {'location': 'somewhere', 'arrival': '1000', 'departure': '1001'}
c.execute(SQL,dict)
Run Code Online (Sandbox Code Playgroud)

在某处插入到位,1000到达到达列,1001到入境列.

我实际拥有的数据将包含位置,但可能包含到达或离开但可能不包含两者(在这种情况下,任何一个或NULL都不能进入表中).在这种情况下,我得到sqlite3.ProgrammingError:你没有提供绑定2的值.

我可以通过使用defaultdict解决这个问题:

c.execute(SQL,defaultdict(str,dict))
Run Code Online (Sandbox Code Playgroud)

为了使事情稍微复杂一些,我实际上会有一个包含多个位置的字典列表,其中包含到达或离开.

    ({'location': 'place1', 'departure': '1000'},
    {'location': 'palce2', 'arrival': '1010'},
    {'location': 'place2', 'departure': '1001'})
Run Code Online (Sandbox Code Playgroud)

我希望能够用c.executemany运行它,但我现在不能使用defaultdict.

我可以循环遍历列表中的每个字典并运行许多c.execute语句,但executemany似乎是一种更为简洁的方法.

为方便起见,我简化了这个示例,实际数据在字典中有更多条目,我从JSON文本文件构建它.

任何人对我如何做到这一点都有任何建议?

python sqlite named-parameters

14
推荐指数
1
解决办法
1万
查看次数

适用于x86/x64体系结构的SQLite dll

我正在VB.net中开发一个程序,并使用System.Data.SQLite预编译的二进制文件用于.NET,但它不适用于x64架构,我得到了经典的文化问题而没有加载正确的文件.

System.BadImageFormatException: 
Could not load file or assembly 'System.Data.SQLite, Version=1.0.65.0, Culture=neutral,
 PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.
File name: 'System.Data.SQLite,
 Version=1.0.65.0,
 Culture=neutral, 
 PublicKeyToken=db937bc2d44ff139'
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用一个dll,可能:

  1. 添加一些指令,如#IFDEF(x86包含部分代码)或x64代码
  2. 加入dll只做一个.
  3. 在VB.net中引用此dll

你认为是其他更好的想法,因为我只想制作一个编译,而不是x32和x64的其他编辑.

例如(32位):

Private Shared Sub OpenConection(ByRef Conn As SQLite.SQLiteConnection)
    Conn = New SQLite.SQLiteConnection("Data Source=" & System.Environment.CurrentDirectory & "\database.db")
    Conn.Open()
End Sub

Private Shared Sub CloseConection(ByRef Conn As SQLite.SQLiteConnection)
    Conn.Close()
    Conn.Dispose()
    Conn = Nothing
End Sub

Public Shared …
Run Code Online (Sandbox Code Playgroud)

c# vb.net sqlite dll

14
推荐指数
2
解决办法
3万
查看次数

如何通过另一个表中的字段获得更快的FTS4查询结果?

背景

我正在对存储在SQLite中的一组电子邮件进行全文搜索,利用其出色的内置FTS4引擎.虽然不完全符合我的预期,但我的查询性能相当差.让我们来看看.

代表架构

我将提供一些有关代码的简化示例,并在适用的地方提供完整代码的链接.

我们有一个MessageTable存储有关电子邮件消息的数据(完整版本分布在几个文件,这里,这里这里):

CREATE TABLE MessageTable (
    id INTEGER PRIMARY KEY,
    internaldate_time_t INTEGER
);
CREATE INDEX MessageTableInternalDateTimeTIndex
    ON MessageTable(internaldate_time_t);
Run Code Online (Sandbox Code Playgroud)

可搜索的文本被添加到名为MessageSearchTable(此处为完整版)的FTS4表中:

CREATE VIRTUAL TABLE MessageSearchTable USING fts4(
    id INTEGER PRIMARY KEY,
    body
);
Run Code Online (Sandbox Code Playgroud)

id搜索表作为一个外键消息表.

我将把它作为练习让读者在这些表格中插入数据(我当然不能透露我的私人电子邮件).我每张桌子的记录不到26k.

问题查询

当我们检索搜索结果时,我们需要按顺序对它们进行排序,internaldate_time_t这样我们才能获取最新的几个结果.这是一个示例搜索查询(此处为完整版):

SELECT id
FROM MessageSearchTable
JOIN MessageTable USING (id)
WHERE MessageSearchTable MATCH 'a'
ORDER BY internaldate_time_t DESC
LIMIT 10 OFFSET 0
Run Code Online (Sandbox Code Playgroud)

在我的机器上,通过我的电子邮件,运行大约150毫秒,通过以下方式测量:

time …
Run Code Online (Sandbox Code Playgroud)

sqlite fts3 fts4

14
推荐指数
1
解决办法
3994
查看次数

SQLite中的GROUP_CONCAT

我有这样的数据

1 A
1 B
1 C
1 D
2 E
2 F
3 G
3 H
3 I
3 J
3 K
Run Code Online (Sandbox Code Playgroud)

通过使用此查询

select ABSTRACTS_ITEM._id,Name 
from ABSTRACTS_ITEM , ABSTRACT_AUTHOR , AUTHORS_ABSTRACT
where
ABSTRACTS_ITEM._id = AUTHORS_ABSTRACT.ABSTRACTSITEM_ID
and
ABSTRACT_AUTHOR._id = AUTHORS_ABSTRACT.ABSTRACTAUTHOR_ID
Run Code Online (Sandbox Code Playgroud)

现在,我想显示这样的数据

1 A,B,C,D
2 EF
Run Code Online (Sandbox Code Playgroud)

等等.我也知道它可以通过GROUP_CONCAT功能来实现.所以,我尝试了这个

SELECT ABSTRACTS_ITEM._id,
GROUP_CONCAT(ABSTRACT_AUTHOR.NAME) FROM
(select ABSTRACTS_ITEM._id,
Name
from
ABSTRACTS_ITEM , ABSTRACT_AUTHOR , AUTHORS_ABSTRACT
where
ABSTRACTS_ITEM._id = AUTHORS_ABSTRACT.ABSTRACTSITEM_ID
and
ABSTRACT_AUTHOR._id = AUTHORS_ABSTRACT.ABSTRACTAUTHOR_ID)
Run Code Online (Sandbox Code Playgroud)

但是,它显示了我的错误.那么,我在这里做错了什么.实现这一目标的正确程序是什么?

sql sqlite group-concat android-sqlite

14
推荐指数
1
解决办法
2万
查看次数

SQLite3终端输出格式.width

在终端中使用SQLite时,这只是一个纯粹的眼睛糖果,但有没有办法用标题格式化列宽,以便每个标题适当调整大小(并独立于其他列)?换句话说,这是输出

.width auto
Run Code Online (Sandbox Code Playgroud)

一张简单的桌子

Id          Name        Price     
----------  ----------  ----------
1           Audi        52642     
2           Mercedes    57127     
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000     
7           Hummer      41400     
8           Volkswagen  21600 
Run Code Online (Sandbox Code Playgroud)

它做了我所期望的.它调整每列的大小,以便显示任何一列中最长的项目.但是,我想自动对输出进行格式化,使得每列足够宽,仅用于其列中的最长项.换句话说,我不想输入

.width 2 10 5
Run Code Online (Sandbox Code Playgroud)

事后得到这个输出

Id  Name        Price
--  ----------  -----
1   Audi        52642
2   Mercedes    57127
3   Skoda       9000 
4   Volvo       29000
5   Bentley     35000
6   Citroen     21000
7   Hummer      41400
8   Volkswagen  21600
Run Code Online (Sandbox Code Playgroud)

我能做些什么来正确自动化列大小调整吗?

sql sqlite terminal formatting

14
推荐指数
4
解决办法
1万
查看次数