Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách viết chuyển đổi để thay đổi khóa chính của mô hình với ManyToManyField

Vì vậy, tôi đã kết thúc với SQL để sửa chữa nó. Cốt lõi của giải pháp của tôi là bên dưới - về cơ bản tôi

  • tạo một chỉ mục trên user_id trong cấu hình mới
    • chỉ mục này cần phải tồn tại trước khi tôi có thể tham chiếu nó như một khóa ngoại
  • tạo một bảng mới thông qua
    • Tôi đã bắt đầu với đầu ra của SHOW CREATE TABLE userprofile_userprofile_subjects (MySQL cụ thể)
    • Tôi đã sửa đổi một chút tên khóa và tên ràng buộc
  • sao chép tất cả dữ liệu vào bảng mới thông qua
  • bỏ cái cũ qua bảng
  • đổi tên bảng mới đến bảng có tên từ bảng cũ đến bảng
  • cuối cùng thực hiện các thao tác mà di chuyển django tự động tạo cho tôi

Tôi mong điều này giúp được người nào khác. Và tôi vẫn muốn biết về một giải pháp tốt hơn.

from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        # ...
    ]

    operations = [
        migrations.RunSQL(
            'ALTER TABLE userprofile_userprofile '
            'ADD INDEX `userprofile_userprofile_1234abcd` (user_id)'
        ),
        migrations.RunSQL (
            'CREATE TABLE userprofile_temp_table ('
            '`id` int(11) NOT NULL AUTO_INCREMENT, '
            '`userprofile_id` int(11) NOT NULL, '
            '`subject_id` int(11) NOT NULL, '
            'PRIMARY KEY (`id`), '
            'UNIQUE KEY `userprofile_userprofile_subjects_userprofile_us_7ded3060_uniq` (`userprofile_id`,`subject_id`), '
            'KEY `userprofile_userprofile_subject_1be9924f` (`userprofile_id`), '
            'KEY `userprofile_userprofile_subject_e5a9504a` (`subject_id`), '
            'CONSTRAINT `subject_id_refs_id_69796996` FOREIGN KEY (`subject_id`) REFERENCES `otherapp_subject` (`id`), '
            'CONSTRAINT `userprofile_user_id_refs_user_id_1234abcd` FOREIGN KEY (`userprofile_id`) REFERENCES `userprofile_userprofile` (`user_id`) '
            ') ENGINE=InnoDB AUTO_INCREMENT=35500 DEFAULT CHARSET=utf8 '
        ),
        migrations.RunSQL (
            'INSERT INTO userprofile_temp_table '
            '(userprofile_id, subject_id) '
            '('
            '  SELECT userprofile_userprofile.user_id, userprofile_userprofile_subjects.subject_id'
            '    FROM userprofile_userprofile_subjects'
            '    INNER JOIN userprofile_userprofile'
            '    ON userprofile_userprofile_subjects.userprofile_id ='
            '        userprofile_userprofile.id'
            ')'
        ),
        migrations.RunSQL (
            'DROP TABLE `userprofile_userprofile_subjects`'
        ),
        migrations.RunSQL (
            'RENAME TABLE `userprofile_temp_table` TO `userprofile_userprofile_subjects`'
        ),
        migrations.RemoveField(
            model_name='userprofile',
            name='id',
        ),
        migrations.AlterField(
            model_name='userprofile',
            name='user',
            field=models.OneToOneField(
                primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL
            ),
            preserve_default=True,
        ),
    ]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn có nhiều lượt thích

  2. lấy hình ảnh base64 từ cơ sở dữ liệu

  3. Hướng dẫn MySQL Workbench - Hướng dẫn Toàn diện về Công cụ RDBMS

  4. Đặt lại mật khẩu gốc của MySQL trên Windows

  5. PHP / MySQL - làm thế nào để tự động tạo liên kết xóa cho một hàng trong bảng đã được tạo tự động?