cari

Rumah  >  Soal Jawab  >  teks badan

MySQL, tambah lajur 'FullNameReverseOrder' dengan data dari lajur nama penuh dan tukar (FName, LName) kepada (LName, FName)

<p>Saya ingin menambah lajur baharu bernama FullNameReverseOrder pada jadual bernama NameTable, di mana maklumat FullName disusun dalam susunan FirstName LastName dan FullNameReverseOrder akan disimpan dalam susunan LastName FirstName. </p> <p>Berikut ialah jadual yang boleh anda gunakan: </p> <pre class="brush:php;toolbar:false;">buat jadual NameTable (ID int, FullName varchar(100), age int, primary key(ID)); masukkan ke dalam NameTable (ID, Nama Penuh, umur) nilai(1, 'ben thompson', 23); Tambahkan lajur baharu bernama FullNameReverseOrder: ubah jadual NameTable tambah lajur FullNameReverseOrder varchar(100) ...tidak tahu apa yang perlu dilakukan di sini... selepas Nama Penuh;</pre> <p><br /></p>
P粉948258958P粉948258958475 hari yang lalu538

membalas semua(1)saya akan balas

  • P粉301523298

    P粉3015232982023-08-18 13:51:58

    Beberapa perkara yang perlu dipertimbangkan.

    • Jangan simpan umur kerana ia berubah setiap tahun dan jadual perlu dikemas kini untuk menggunakan tarikh lahir sebaliknya.
    • Jika tersedia, gunakan lajur yang berasingan untuk menyimpan nama pertama, akhir dan nama tengah.

    Berdasarkan soalan

    Pertimbangkan contoh data berikut di mana FullNamelajur terdiri daripada sehingga tiga perkataan yang dipisahkan oleh ruang

    create table NameTable (
      ID int, 
      FullName varchar(100), 
      age int, 
      primary key(ID) );
    
    insert into NameTable (ID, FullName, age) values
      (1, 'ben thompson', 23),
      (2, 'Martin Luther King', 23);

    Pertanyaan,

    SELECT SUBSTRING_INDEX(TRIM(FullName), ' ', -1) LastName,
           SUBSTRING_INDEX(TRIM(FullName), ' ', 1) FirstName,
           SUBSTR(FullName, LOCATE(' ',FullName) + 1,  (CHAR_LENGTH(FullName) - LOCATE(' ',REVERSE(FullName)) - LOCATE(' ',FullName)))  AS MiddleName   
    FROM NameTable;

    Keputusan,

    LastName    FirstName   MiddleName
    Thompson      Ben   
    King          Martin      Luther

    Mula-mula buat perubahan dengan mengubah suai struktur jadual Jika terdapat banyak urus niaga, saya cadangkan untuk mengunci jadual dengan sewajarnya

    SET autocommit=0; 
    LOCK TABLES NameTable WRITE; 
    alter table NameTable add column FullNameReverseOrder varchar(100) after FullName;
    COMMIT; 
    UNLOCK TABLES;

    Untuk mengemas kini lajur yang baru ditambah Nama Akhir, Nama Tengah dan Nama Pertama, gunakan arahan berikut:

    update NameTable
    set FullNameReverseOrder = concat_ws(' ' ,SUBSTRING_INDEX(TRIM(FullName), ' ', -1),
                                      SUBSTR(FullName, LOCATE(' ',FullName)+1,  (CHAR_LENGTH(FullName) - LOCATE(' ',REVERSE(FullName)) - LOCATE(' ',FullName))),
                                      SUBSTRING_INDEX(TRIM(FullName), ' ', 1) );

    Pilih,

    select * 
    from NameTable;

    Hasilnya

    ID  FullName             FullNameReverseOrder      age
    1   ben thompson          thompson  ben            23
    2   Martin Luther King    King Luther Martin       23

    Sekarang, jika anda mahu proses ini berlaku secara automatik, pertimbangkan untuk mencipta pencetus.

    CREATE TRIGGER FullNameReverseOrderUpdate BEFORE INSERT ON NameTable
    FOR EACH ROW BEGIN
    
    SET new.FullNameReverseOrder = (concat_ws(' ' ,SUBSTRING_INDEX(TRIM(new.FullName), ' ', -1),
                                      SUBSTR(new.FullName, LOCATE(' ',new.FullName)+1,  (CHAR_LENGTH(new.FullName) - LOCATE(' ',REVERSE(new.FullName)) - LOCATE(' ',new.FullName))),SUBSTRING_INDEX(TRIM(new.FullName), ' ', 1) ));
    END;

    Masukkan nilai ujian

    insert into NameTable (ID, FullName, age) values
      (3, 'Arthur  Thompson', 23);
    
    select * from NameTable;

    Hasilnya

    ID  FullName             FullNameReverseOrder     age
    1   ben thompson           thompson  ben           23
    2   Martin Luther King     King Luther Martin      23
    3   Arthur  Thompson       Thompson  Arthur        23

    Lihat contoh

    balas
    0
  • Batalbalas