我有一个Chef配方,用于创建Unix用户ID并在多个节点上部署它们,以保证唯一性并防止开发人员自己跟踪它们。它们只是为应用程序命名,如果该应用程序的ID尚不存在,则会为其授予唯一ID。如果有,则只返回脚本,并在具有适当值的Web服务器上创建用户帐户。
我有一个带有单个表的mysql数据库,名为application_id_table,它有两列,id和application_name。 id是自动增量,应用程序名称不能为空(并且必须是唯一的)。
从我的脚本中删除Ruby并进行一些替换,我的sql看起来像这样:
INSERT INTO application_id_table(application_name)VALUES('andy_test') 什么不存在(从application_id_table WHERE中选择1 application_name ='andy_test');
运行时,我收到语法分析错误:
错误1064(42000):您的SQL语法有错误;检查 手册,对应右边的MySQL服务器版本 在'WHERE NOT EXISTS附近使用的语法(从中选择1) application_id_table WHERE application_name ='a'
我记得看到values语句不允许使用where子句但我不希望使用select语句来填充值,因为我正在从Ruby / Chef中提供的变量中填充它们。任何人都知道如何做到这一点?
答案 0 :(得分:0)
您想使用insert . . . select
:
INSERT INTO application_id_table(application_name)
SELECT aname
FROM (SELECT 'andy_test' as aname) t
WHERE NOT EXISTS (select 1 from application_id_table ait WHERE ait.application_name = t.aname);
您应该能够将变量直接插入select
语句,就像使用VALUES
语句一样。
答案 1 :(得分:0)
试试这个:
INSERT INTO application_id_table(application_name)
select 'andy_test'
WHERE NOT EXISTS (select 1 from application_id_table WHERE application_name = 'andy_test');