cari

Rumah  >  Soal Jawab  >  teks badan

Tambahkan kunci asing pada jenis data besar seperti varchar(2000) mysql tables

<p>Saya mempunyai dua jadual "statistik_gabungan" dan "urus niaga", 'affiliate_stats' mempunyai lajur 'affiliate_sales' varchar(2000) (subjadual), dan "transaksi" mempunyai lajur "_id" varchar(100) kunci utama (jadual induk)</p> <p>Apabila saya menambah kunci asing pada "affiliate_sales" yang merujuk kepada "_id" melalui <kod>Tukar jadual</kod>affiliate_stats<kod>Tambah kekangan</code>fk_affili_sales<kod>Transaksi rujukan kunci asing (</kod>/id<<< /p> <p>beri saya ralat ini <kod>Kekunci yang ditentukan terlalu panjang; Saya tahu kedua-dua lajur harus sama saiznya, tetapi dalam kes saya, saya memerlukan saiz yang berbeza untuk mengendalikan ini. Dicari dalam banyak sumber, tiada jawapan yang jelas, dan tiada penyelesaian yang berkesan untuk saya. </p>
P粉378264633P粉378264633451 hari yang lalu543

membalas semua(2)saya akan balas

  • P粉321676640

    P粉3216766402023-09-06 12:42:54

    akan disenaraikan affiliate_sales 更改为 VARCHAR(100).

    ALTER TABLE `affiliate_stats` 
      MODIFY COLUMN affiliate_tales VARCHAR(100) NOT NULL,
      ADD CONSTRAINT `fk_affili_sales` 
      FOREIGN KEY (affiliate_sales) 
      REFERENCES transaction(`_id`);

    Sekiranya transaction(_id) 的外键,那么它不需要是 VARCHAR(2000) kerana ia tidak boleh memegang rentetan lebih daripada 100 aksara pula.

    Sebelum melakukan ini, pastikan pada masa ini tiada rentetan lebih daripada 100 aksara dalam lajur.


    Balas komen anda:

    Jika anda bercadang untuk menyimpan "tatasusunan" (iaitu rentetan dengan senarai dipisahkan koma) dalam lajur, anda harus faham bahawa anda tidak boleh membuat kunci asing padanya juga. Kunci asing memerlukan lajur untuk mengaitkan nilai dengan transaction baris dalam jadual. Jika anda menambah kekangan kunci asing, hanya satu id boleh disimpan dalam lajur.

    Nampaknya memang wujud perhubungan banyak-ke-banyak antara status_afiliasi dan affiliate_statstransaction. Anda memerlukan jadual ketiga untuk memodelkan perhubungan banyak-ke-banyak.

    balas
    0
  • P粉147045274

    P粉1470452742023-09-06 00:41:33

    varchar(2000) Menyimpan 2000 aksara, tetapi setiap aksara tidak semestinya 1 bait. Aksara Eropah mudah seperti a, 1 dan ? Walau bagaimanapun, ü atau å atau َََُِّْ‎ mengambil berbilang bait.


    Kemungkinan jenis rentetan tidak perlu sama panjang.

    Namun, ini tidak perlu. Kunci tidak boleh melebihi 100 aksara. Kunci utama anda ialah varchar(100), jadi kunci asing tidak akan melebihi 100 aksara.

    Namun, nampaknya anda ingin menyimpan dua jenis data yang berbeza dalam lajur ini. Satu ialah jenis tatasusunan tertentu, dan satu lagi ialah kunci asing. kamu tidak boleh. Kunci asing pastikan bahawa setiap nilai mempunyai nilai kunci utama yang sepadan.


    Sebaliknya, gunakan kenaikan automatik kunci utamauntuk memautkan jadual bersama-sama. Ia lebih ringkas, lebih pantas, menggunakan kurang storan, jelas dan tidak pernah berubah.

    Tambah lajur baharu sebagai kunci utama untuk kedua-dua jadual. Kemudian memetiknya.


    Anda tidak boleh menyimpan berbilang kunci dalam satu lajur. MySQL perlu dapat mengesahkan bahawa setiap kunci asing mempunyai kunci utama yang sepadan, dan hanya boleh melakukan ini dengan menyemak sama ada ia betul-betul sama.

    Sebaliknya, jika setiap baris affiliate_stats sepadan dengan berbilang affiliate_sales, anda memerlukan join table. Ini dipanggil hubungan satu-ke-banyak. Satu baris affiliate_stats berkaitan dengan banyak affiliate_sales.

    -- I'm assuming we've changed to bigint primary keys.
    create table affiliate_stats_sales (
        affiliate_sales_id bigint not null,
        foreign key(affiliate_sales_id) references affiliate_sales(id),
    
        affiliate_stats_id bigint not null,
        foreign key(affiliate_stats_id) references affiliate_stats(id)
    );

    Sekarang, masukkan baris dalam affiliate_stats_sales untuk setiap affiliate_sale yang anda ingin tambahkan pada baris affiliate_stats.

    -- Relate affiliate_sale 100 to affiliate_stats 20
    insert into affiliate_stats_sales(affiliate_sales_id, affiliate_stats_id) values (100, 20)

    Data jualan dan statistik berkaitan dengan menyertai jadual ini. Sebagai contoh, jika anda ingin melihat statistik untuk jualan 100 unit.

    select affiliate_stats.*
    from affiliate_stats
    join affiliate_stats_sales
      on affiliate_stats_sales.affiliate_stats_id = affiliate_stats.id
    where affiliate_sales.id = 100

    Agak sukar pada mulanya, tetapi sangat berkuasa. Inilah cara pangkalan data hubungan berfungsi.

    balas
    0
  • Batalbalas