我正在从SQLite中获取创建语句查询,如下所示:
CREATE TABLE [users] ([id] INTEGER PRIMARY KEY AUTOINCREMENT, [username] VARCHAR, [password] VARCHAR, [default_project] VARCHAR)
使用
创建SELECT sql FROM sqlite_master WHERE type = 'table' AND name = :table
并使用如下正则表达式确定自动增量字段:
/\b\[?id\]?\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT\b/Ui
问题在于,有不同的可接受方式来撰写"id"
,`id`
,'id'
等关键字。这里显示http://www.sqlite.org/lang_keywords.html
我想创建一个正则表达式,明确检查这些不同的变体......在其他人的帮助下我已经达到了这个目的:
$pattern = "/\b\"(id)|(\"id\")|(\[id\])|(`id`)|('id')\"\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT\b/Ui";
然而,这有几个问题...一个是INTEGER PRIMARY KEY AUTOINCREMENT
不再检查... ('id')
没有正确匹配...但是如果我将它的位置与("id")
...交换比它的工作和("id")
不会。
答案 0 :(得分:0)
/(\"id\"|\[id\]|\'id\'|`id`|\\bid)\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/Ui
似乎按预期工作。
答案 1 :(得分:0)
[id]
与[id]
不匹配,但仅与i
和d
匹配,您要搜索的内容可能是:
$pattern = "/\s(\"[a-z]+\"|\[[a-z]+\]|'[a-z]+'|[a-z]+)\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/Ui";
使用[a-z]+
,以便您可以匹配任何字母字段名称,然后在第一个匹配项中找到它(另请注意,可能存在不使用AUTOINCREMENT
关键字的rowid:它们是两者都有效但有slightly different meaning)。