Thêm ràng buộc duy nhất Di chuyển Laravel

Để di chuyển dữ liệu một cách an toàn và không có thời gian chết, PlanetScale yêu cầu tất cả các bảng phải có một khóa duy nhất, không phải là khóa không thay đổi trong quá trình di chuyển. Yêu cầu này có thể gây khó khăn nếu, ví dụ: bạn cố gắng THAY ĐỔI khóa chính của một bảng không có khóa duy nhất nào khác

Nếu bạn cố gắng triển khai thay đổi lược đồ như vậy, yêu cầu triển khai sẽ không thành công với lỗi All tables must have at least one unique, not-null key that remains unchanged during the migration

Ghi chú

Ví dụ này thêm một khóa duy nhất tạm thời nhưng bạn cũng có thể sử dụng một chỉ mục duy nhất hoặc tạo khóa tạm thời bằng cách thêm một ràng buộc duy nhất

Việc thay đổi một khóa duy nhất có thể được thực hiện trong 3 bước. Mỗi bước là một

  1. Thêm khóa duy nhất tạm thời. Để thay đổi một khóa duy nhất, trước tiên bạn cần thêm một khóa duy nhất khác mà PlanetScale có thể sử dụng trong quá trình di chuyển. Trong một nhánh mới, thêm một khóa mới trên một cột duy nhất hoặc tổ hợp các cột. Các cột mục tiêu không được chứa giá trị null

    SQL

    Đã sao chép

    ALTER TABLE table_name ADD UNIQUE KEY temp_unique_key [`column`,`column2`];
    

    Triển khai thay đổi này thông qua yêu cầu triển khai

  2. Thay đổi khóa gốc. Giờ bạn đã có khóa duy nhất thứ hai, bạn có thể thay đổi khóa ban đầu. Trong một nhánh mới, hãy áp dụng thay đổi lược đồ dự định của bạn

    Ví dụ của chúng tôi loại bỏ khóa chính hiện có và thay thế nó bằng khóa chính phức hợp

    SQL

    Đã sao chép

    ALTER TABLE table_name DROP PRIMARY KEY, ADD PRIMARY KEY[`column`,`column2`];
    

    Triển khai thay đổi này thông qua yêu cầu triển khai

  3. Bỏ khóa duy nhất tạm thời. Sau khi khóa chính được cập nhật, bạn có thể xóa khóa duy nhất tạm thời mà bạn đã thêm ở Bước 1

    Trong một nhánh mới, bỏ khóa tạm thời

    SQL

    Đã sao chép

    ALTER TABLE table_name DROP KEY temp_unique_key;
    

    Khi yêu cầu triển khai này đã được triển khai, bạn sẽ thay đổi khóa chính duy nhất của bảng và xóa khóa duy nhất tạm thời được tạo ở bước 1

Các thay đổi lược đồ không chặn của PlanetScale hoạt động bằng cách trước tiên tạo một bảng ma, giống như bảng gốc của bạn. Bảng ma sau đó được thay đổi để phù hợp với lược đồ đã thay đổi của bạn. Chúng tôi sao chép dữ liệu từ bảng gốc, cũng như truyền mọi thay đổi khi chúng xảy ra với bảng ma. Khi bảng ma này đồng bộ với bản gốc, chúng tôi hoán đổi các bảng tại chỗ. Điều này hoàn tất quá trình di chuyển một cách an toàn

Để làm điều này, chúng ta cần phải có một khóa chính hoặc khóa duy nhất nhất quán trên cả hai bảng để sao chép dữ liệu một cách đáng tin cậy qua. Đây là lý do tại sao chúng tôi yêu cầu một khóa nhất quán khi di chuyển dữ liệu của bạn

Hướng dẫn này cung cấp quy trình ba bước để cập nhật khóa duy nhất của bảng và có thể được lặp lại thường xuyên nếu cần

Một chỉ mục duy nhất đảm bảo các cột khóa chỉ mục không chứa bất kỳ giá trị trùng lặp nào. Chỉ mục duy nhất có thể là tổng hợp [nhiều]

Laravel sẽ tự động tạo một tên chỉ mục duy nhất dựa trên tên bảng, tên cột và loại chỉ mục [duy nhất] khi tạo chỉ mục. Để xóa một chỉ mục duy nhất, trước tiên bạn phải đặt tên cho nó

Tạo chỉ mục duy nhất

Tạo một chỉ mục duy nhất với tên user_email_unique

$table->string['email']->unique[];
// or
$table->string['email'];
$table->unique['email'];

Thả chỉ số duy nhất

users_email_unique - là tên của Chỉ mục duy nhất

  • người dùng - tên bảng
  • email - cột chỉ mục
  • duy nhất - loại chỉ mục/khóa
$table->dropUnique['users_email_unique'];

Tạo chỉ mục tổng hợp duy nhất

Tạo một chỉ mục duy nhất tổng hợp với tên người dùng_tên_email_unique

$table->unique[['email', 'name']];

Thả chỉ mục tổng hợp duy nhất

users_name_email_unique - là tên của Composite Unique Index

  • người dùng - tên bảng
  • email - cột đầu tiên
  • tên - cột thứ hai
  • duy nhất - loại chỉ mục/khóa
$table->dropUnique['users_name_email_unique'];

Tạo chỉ mục duy nhất với tên tùy chỉnh

MySQL có một giới hạn ở đây. 64 ký tự cho độ dài tên chỉ mục duy nhất. Bạn có thể cần phải tự đặt tên chỉ mục

Chủ Đề