2012-10-17 39 views
6

在這裏我們去:mysql鎖定錯誤或錯誤?

mysql> LOCK TABLES radcheck WRITE; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT * FROM radcheck WHERE id NOT IN (
    ->  SELECT id FROM (
    ->   SELECT id FROM radcheck WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1 
    ->  ) AS c 
    ->); 
ERROR 1100 (HY000): Table 'radcheck' was not locked with LOCK TABLES 

跆拳道?

編輯

SET AUTOCOMMIT = 0 
    -> ; 
Query OK, 0 rows affected (0.00 sec) 

mysql> LOCK TABLES radcheck WRITE; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT * FROM radcheck WHERE id NOT IN (SELECT id FROM radcheck WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1); 
ERROR 1100 (HY000): Table 'radcheck' was not locked with LOCK TABLES 



mysql> LOCK TABLES radcheck READ; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT * FROM radcheck WHERE id NOT IN (SELECT id FROM radcheck WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1); 
ERROR 1100 (HY000): Table 'radcheck' was not locked with LOCK TABLES 

PD:查詢工作正常,如果我不鎖定表。 pd:這只是一個簡單的問題..在現實生活中是一個刪除...

+1

檢查我的答案。您需要爲所有表格提供別名。並且需要使用該別名鎖定子查詢表 –

回答

12

當你使用鎖表,你需要鎖定在查詢中的所有表。 當您使用子查詢時,它會創建一個表格。而你並沒有鎖定它。 ,因爲你得到錯誤。

參考: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

給一個別名內表

測試樣品:

lock tables products as p1 write, products as p2 write ; 
select product_id from products as p1 
where product_id not in ( 
select product_id from products p2 where product_id in (1,2) 
) 

,可能就需要這樣的:

lock tables radcheck as r1 write, radcheck as r2 write ; 

SELECT * FROM radcheck r1 WHERE id NOT IN (
SELECT id FROM (
    SELECT id FROM radcheck r2 WHERE attribute = 'Password' GROUP BY UserName HAVING COUNT(*) > 1) AS c 
); 
0

您鎖定表的WRITE。您需要鎖定READ的表格,因爲您使用的只是從表格中讀取的SELECT

但是,您不應該鎖定表,因爲這會阻止併發。

編輯

你還需要爲你使用的是同一個表兩次在查詢中使用別名。

LOCK TABLES radcheck AS read1 READ, radcheck AS read2 READ; 
SELECT * 
FROM radcheck AS read1 
WHERE id NOT IN 
    (
     SELECT id FROM radcheck AS read2 
     WHERE attribute = 'Password' 
     GROUP BY UserName 
     HAVING COUNT(*) > 1 
    );