2009-03-20 33 views
21

Tôi có một cột trong bảng có tiêu đề 'được ủy quyền'. mặc định của nó là 0. Nó cần phải được thay đổi để 1 khi người dùng được ủy quyền, nhưng nó phải có khả năng được thiết lập lại để 0. Tôi biết tôi có thể làm điều này một cách dễ dàng với 2 câu hỏi như sau:Có cách nào trong MySQL để đảo ngược một trường boolean với một truy vấn không?

$authorised = Db::query('SELECT authorised FROM users WHERE id=2'); 

$newAuthValue = ($authorised['authorised']) ? 0 : 1; 

Db::query('UPDATE users SET authorised=' . $newAuthValue . ' WHERE id=2'); 

gì Tôi muốn biết, có cách nào để làm điều này với một truy vấn? Để đảo ngược giá trị boolean?

Trả lời

27
UPDATE users SET `authorised` = IF (`authorised`, 0, 1) 
+0

Điều này có vẻ IMO rõ ràng hơn. :) – alex

+0

Chỉ cần chắc chắn rằng bạn thêm mệnh đề where, alex. –

+0

@Peter, cảm ơn, và vâng tôi đã làm. – alex

4

Có nhiều cách để làm điều này, đây là một đơn giản:

UPDATE users SET authorised = ABS(authorised - 1) WHERE id = 2; 
+0

Rất tiếc, đã bỏ lỡ điều đó. Cảm ơn Chad. – alex

+4

tại sao không chỉ "1 - được ủy quyền"? – nickf

+1

@nickf: Tôi đồng ý với bạn, những điều sau đây sẽ hoạt động: CẬP NHẬT người dùng SET được ủy quyền = 1 - được ủy quyền WHERE id = 2; – dalle

30
UPDATE `users` SET `authorised` = NOT `authorised` WHERE id = 2 

Truy vấn này cũng sẽ làm việc để phủ nhận lĩnh vực này, và là inline hơn với cú pháp boolean.

+0

Ok, điều đó đã không được đăng đúng cách, những dấu gạch chéo đó phải là dấu gạch chéo ngược, đó là trình đóng gói mặc định của MySQL. –

+0

Đó là một điều tốt ...! +1 – alex

+1

SET authorized =! Authorized –

4

của nó cũng có thể sử dụng XOR nếu trường 'boolean' của bạn được thực hiện như một TINYINT:

UPDATE users SET authorised = authorised XOR 1 WHERE id = 2; 

này sẽ thiết lập 'có thẩm quyền' là 0 nếu hiện 1, và 1 nếu hiện 0. Nó sẽ cũng zeroise tất cả các giá trị khác 0, do đó, là một giải pháp lý tưởng nếu bạn (như tôi) sử dụng một số giá trị tích cực để phản ánh một loạt các mức 'on', nhưng luôn luôn cần phải hoàn nguyên về 0 khi 'off'.

Các vấn đề liên quan