Mysql在条件插入时崩溃了

时间:2017-10-24 08:28:56

标签: mysql crash conditional sql-insert

我需要在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之前运行此代码没有任何问题。 有什么想法吗?

5 个答案:

答案 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)