我需要在insert语句上使用一些条件来防止未经授权的插入。 我写了这样的话:
INSERT INTO `fund` (amount,description)
SELECT 1000,'Some description'
WHERE 12 IN (SELECT id FROM users WHERE allow_add=1)
其中12是当前用户的id。 但mysql进程意外停止了! 我使用XAMPP和MySQL版本:5.5.5-10.1.13-MariaDB。 请注意,我在SQL Server之前运行此代码没有任何问题。 有什么想法吗?
答案 0 :(得分:0)
在查询中添加分号(;),以及desc
在查询中执行的操作。它将描述表结构及其属性。
答案 1 :(得分:0)
这不是在数据库中授权插入的正确方法。相反,您可以使用基于编程的解决方案来解决此问题。
在PHP中,一个合适的解决方案可能是: -
if ($user->allow_add == 1){ //where $user is the User instance for current user
$sql->query("INSERT INTO `fund` (amount,desc) VALUES(1000,'Some desc')");
}
答案 2 :(得分:0)
试试这个:
INSERT INTO `fund` (amount,desc)
SELECT 1000 as amt,'Some desc' as des FROM users WHERE allow_add=1 LIMIT 12
答案 3 :(得分:0)
来自用户和哪里存在工作所以可能是一个错误?
MariaDB [sandbox]> delete from t where att = 3;
Query OK, 2 rows affected (0.04 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> select * from t;
+------+------+
| id | att |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 2 | 0 |
+------+------+
3 rows in set (0.00 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> insert into t(id,att)
-> select 4,3
-> from users
-> where id = 1;
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]>
MariaDB [sandbox]> select * from t;
+------+------+
| id | att |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 2 | 0 |
| 4 | 3 |
+------+------+
4 rows in set (0.00 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> insert into t(id,att)
-> select 4,3
-> where exists (select 1 from users where id = 1);
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]> select * from t;
+------+------+
| id | att |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 2 | 0 |
| 4 | 3 |
| 4 | 3 |
+------+------+
5 rows in set (0.00 sec)
答案 4 :(得分:0)
感谢P.Salmon answer,我找到了解决方案。似乎MySQL在条件SELECT中需要FROM语句,与SQL Server不同。所以,我添加一个临时表名如下:
INSERT INTO `fund` (amount,description)
SELECT 1000,'Some description'
FROM (SELECT 1) t
WHERE 12 IN (SELECT id FROM users WHERE allow_add=1)