có thể hoán đổi các giá trị khóa chính giữa hai bộ dữ liệu không? Nếu vậy, làm thế nào một trong những sẽ làm điều đó?sql trao đổi giá trị khóa chính
Trả lời
Hãy vì lợi ích của sự đơn giản giả sử bạn có hai kỷ lục
id name
---------
1 john
id name
---------
2 jim
cả từ bảng t (nhưng họ có thể đến từ các bảng khác nhau)
Bạn có thể làm
UPDATE t, t as t2
SET t.id = t2.id, t2.id = t.id
WHERE t.id = 1 AND t2.id = 2
Note : Cập nhật các khóa chính có các tác dụng phụ khác và có thể cách tiếp cận ưa thích sẽ là để lại các khóa chính như chúng và trao đổi các giá trị của tất cả các thứ e các cột khác.
Lưu ý: Lý do tại sao các hoạt động t.id = t2.id, t2.id = t.id
là do trong SQL cập nhật xảy ra ở cấp giao dịch. t.id
không thay đổi và =
không được gán. Bạn có thể giải thích nó là "set t.id thành giá trị t2.id có trước hiệu ứng của truy vấn, đặt t2.id thành giá trị t.id trước khi có hiệu lực của truy vấn". Tuy nhiên, một số cơ sở dữ liệu có thể không làm cách ly thích hợp, xem ví dụ này question (tuy nhiên, chạy trên truy vấn, có thể được coi là cập nhật nhiều bảng, hoạt động theo tiêu chuẩn trong mysql).
cảm ơn rất nhiều bất tiện! – Thomas
Không có trong MySQL 5.1.62 với 'ERROR 1062 (23000): Mục nhập trùng lặp '2' cho khóa 'PRIMARY''. – dotancohen
Giải pháp của bạn không hoạt động trong MySQL 5.5.22-log: '1706 - Không cho phép cập nhật khóa chính/phân vùng chính vì bảng được cập nhật cả dưới dạng 'lae_marketing_invoice_history' và 't2'.' –
Tôi thích cách tiếp cận sau (Justin Cave viết tương tự ở đâu đó):
update MY_TABLE t1
set t1.MY_KEY = (case when t1.MY_KEY = 100 then 101 else 100 end)
where t1.MYKEY in (100, 101)
Đặt các giá trị khóa thô dưới dạng chữ trong truy vấn giải quyết vấn đề của các khóa trùng lặp trong quá trình giao dịch. –
Tương tự như @ giải pháp Bart, nhưng tôi đã sử dụng một cách hơi khác nhau:
update t
set t.id=(select decode(t.id, 100, 101, 101, 100) from dual)
where t.id in (100, 101);
này khá giống nhau , nhưng tôi biết decode
tốt hơn thì case
.
Ngoài ra, để thực hiện công việc @ giải pháp Bart cho tôi, tôi đã có thêm một when
:
update t
set t.id = (case when t.id = 100 then 101 else 101 end)
where t.id in (100, 101);
- 1. Trao đổi các khóa và giá trị trong một băm
- 2. Thay đổi khóa mảng getResult cho giá trị khóa chính
- 3. Làm cách nào để trao đổi giá trị của bản ghi trong Oracle SQL?
- 4. Làm thế nào để trao đổi các khóa với các giá trị trong mảng?
- 5. Trao đổi khóa và giá trị của bản đồ bằng C++
- 6. Làm cách nào để trao đổi giá trị cột trong máy chủ sql 2008?
- 7. Giá trị thay đổi SQL
- 8. SQL Server: thay đổi khóa chính với hàng liên quan
- 9. Máy chủ SQL PIVOT trên bảng khóa-giá trị
- 10. Thay đổi cột khóa chính trong SQL Server
- 11. RabbitMQ Trao đổi chủ đề: 1 Trao đổi so với nhiều trao đổi
- 12. Tìm giá trị hiện có trong cặp Giá trị chính
- 13. Trao đổi các giá trị mảng với và cho ra scala
- 14. Thay đổi khóa chính thành khóa tổng hợp (khóa chính đã tồn tại)
- 15. Cách thay đổi giá trị của khóa chính và cập nhật khóa ngoại trong cùng một thời điểm
- 16. Thêm cột khóa chính trong bảng SQL
- 17. Trao đổi các giá trị với ràng buộc duy nhất trong Khung thực thể
- 18. Trao đổi các giá trị trong một tuple/list bên trong một danh sách trong python?
- 19. C# đan cài Trao đổi
- 20. Đặt cặp khóa/giá trị
- 21. EF 5 - Số lượng giá trị khóa chính được truyền phải khớp với số lượng giá trị khóa chính được xác định trên thực thể
- 22. sửa đổi registry trị khóa
- 23. Chuyển đổi Enums thành các cặp khóa, giá trị
- 24. Chuyển đổi để cặp khóa-giá trị trong Net
- 25. băm ruby thêm khóa/giá trị nếu sửa đổi
- 26. array_walk_recursive - sửa đổi cả khóa và giá trị
- 27. khóa chính và chỉ mục sql
- 28. Tạo nhận dạng SQL làm khóa chính?
- 29. FindAsync với giá trị chính phi chính
- 30. tạo giá trị khóa AES 256 bit
Tôi cũng không có ý tưởng gì, cụ thể, bạn đang cố gắng đạt được. – bmargulies
Tại sao bạn muốn làm điều đó? Bạn không thích các khóa chính của bạn? ;) –
Và có, có thể. Ví dụ, trong perl có fetchall_hashref chấp nhận bất kỳ tên cột nào được sử dụng. – Konerak