ລາຍການຫົວເລື່ອງ
ວິທີການຈັດການກັບຂໍ້ມູນທີ່ຊໍ້າກັນໃນ ຄໍາຖາມ MySQL ? ຄໍາສັ່ງສໍາລັບການກັ່ນຕອງແລະການລຶບຂໍ້ມູນທີ່ຊໍ້າກັນແມ່ນຫຍັງ?
MySQL ຈັດການຂໍ້ມູນຊໍ້າກັນ
ອາດຈະມີບັນທຶກຊໍ້າກັນໃນບາງຕາຕະລາງຂໍ້ມູນ MySQL ໃນບາງກໍລະນີ, ພວກເຮົາອະນຸຍາດໃຫ້ມີຂໍ້ມູນຊໍ້າກັນ, ແຕ່ບາງຄັ້ງພວກເຮົາຍັງຈໍາເປັນຕ້ອງລຶບຂໍ້ມູນທີ່ຊ້ໍາກັນເຫຼົ່ານີ້.
ໃນບົດນີ້, ພວກເຮົາຈະແນະນໍາວິທີການປ້ອງກັນຂໍ້ມູນຊ້ໍາກັນໃນຕາຕະລາງຂໍ້ມູນແລະວິທີການລຶບຂໍ້ມູນທີ່ຊ້ໍາກັນຢູ່ໃນຕາຕະລາງຂໍ້ມູນ.
ປ້ອງກັນຂໍ້ມູນຊໍ້າກັນໃນຕາຕະລາງ
ທ່ານສາມາດຕັ້ງ field ສະເພາະໃນຕາຕະລາງ MySQL ເປັນ PRIMARY KEY ຫຼື UNIQUE index ເພື່ອຮັບປະກັນຄວາມເປັນເອກະລັກຂອງຂໍ້ມູນ.
ໃຫ້ລອງຕົວຢ່າງ: ບໍ່ມີດັດສະນີແລະລະຫັດຕົ້ນຕໍໃນຕາຕະລາງຂ້າງລຸ່ມນີ້, ດັ່ງນັ້ນຕາຕະລາງອະນຸຍາດໃຫ້ບັນທຶກຊ້ໍາກັນຫຼາຍ.
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
ຖ້າທ່ານຕ້ອງການກໍານົດ fields first_name ແລະ last_name ໃນຕາຕະລາງ, ຂໍ້ມູນບໍ່ສາມາດຊ້ໍາກັນໄດ້, ທ່ານສາມາດຕັ້ງໂຫມດຫຼັກສອງເທົ່າເພື່ອກໍານົດຄວາມເປັນເອກະລັກຂອງຂໍ້ມູນ. ຖ້າທ່ານຕັ້ງລະຫັດຫຼັກສອງເທົ່າ, ຄ່າເລີ່ມຕົ້ນຂອງລະຫັດນັ້ນ. ບໍ່ສາມາດເປັນ NULL, ແຕ່ສາມາດຕັ້ງເປັນ NOT NULL.ດັ່ງນີ້:
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY (last_name, first_name) );
ຖ້າພວກເຮົາກໍານົດດັດສະນີທີ່ເປັນເອກະລັກ, ຫຼັງຈາກນັ້ນ, ເມື່ອໃສ່ຂໍ້ມູນຊ້ໍາກັນ, ຄໍາສັ່ງ SQL ຈະບໍ່ປະຕິບັດຢ່າງສໍາເລັດຜົນແລະຖິ້ມຄວາມຜິດພາດ.
ຄວາມແຕກຕ່າງລະຫວ່າງ INSERT IGNORE INTO ແລະ INSERT INTO ແມ່ນວ່າ INSERT IGNORE ບໍ່ສົນໃຈຂໍ້ມູນທີ່ມີຢູ່ແລ້ວໃນຖານຂໍ້ມູນ ຖ້າບໍ່ມີຂໍ້ມູນໃນຖານຂໍ້ມູນ, ມັນຈະໃສ່ຂໍ້ມູນໃຫມ່, ແລະຖ້າມີຂໍ້ມູນ, ມັນຈະຂ້າມຂໍ້ມູນນີ້.ດ້ວຍວິທີນີ້, ຂໍ້ມູນທີ່ມີຢູ່ໃນຖານຂໍ້ມູນສາມາດຖືກຮັກສາໄວ້, ແລະຈຸດປະສົງຂອງການໃສ່ຂໍ້ມູນໃນຊ່ອງຫວ່າງແມ່ນສາມາດບັນລຸໄດ້.
ຕົວຢ່າງຕໍ່ໄປນີ້ໃຊ້ INSERT IGNORE INTO, ເຊິ່ງດໍາເນີນການໂດຍບໍ່ມີຂໍ້ຜິດພາດ ແລະບໍ່ໄດ້ໃສ່ຂໍ້ມູນຊໍ້າກັນເຂົ້າໄປໃນຕາຕະລາງຂໍ້ມູນ:
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas'); Query OK, 1 row affected (0.00 sec) mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas'); Query OK, 0 rows affected (0.00 sec)
INSERT ignore ເຂົ້າໄປໃນເມື່ອໃສ່ຂໍ້ມູນ, ຫຼັງຈາກຄວາມເປັນເອກະລັກຂອງບັນທຶກໄດ້ຖືກກໍານົດ, ຖ້າຂໍ້ມູນຊ້ໍາກັນຖືກໃສ່, ບໍ່ມີຂໍ້ຜິດພາດຈະຖືກສົ່ງຄືນ, ແຕ່ວ່າຈະມີການເຕືອນຄືນເທົ່ານັ້ນ.ແລະປ່ຽນແທນເຂົ້າໄປໃນຖ້າມີບັນທຶກຫຼັກ ຫຼືເປັນເອກະລັກ, ໃຫ້ລຶບມັນອອກກ່ອນ.ໃສ່ບັນທຶກໃໝ່.
ອີກວິທີໜຶ່ງໃນການຕັ້ງຄ່າຄວາມເປັນເອກະລັກຂອງຂໍ້ມູນຂອງທ່ານແມ່ນການເພີ່ມດັດຊະນີ UNIQUE ແບບນີ້:
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10) UNIQUE (last_name, first_name) );
ສະຖິຕິຂໍ້ມູນຊໍ້າກັນ
ຂ້າງລຸ່ມນີ້ພວກເຮົາຈະນັບຈໍານວນການຊ້ໍາກັນຂອງ first_name ແລະ last_name ໃນຕາຕະລາງ:
mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> FROM person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1;
ຄໍາຖະແຫຼງການສອບຖາມຂ້າງເທິງຈະສົ່ງຄືນຈໍານວນບັນທຶກທີ່ຊ້ໍາກັນໃນຕາຕະລາງ person_tbl.ໂດຍທົ່ວໄປ, ເພື່ອສອບຖາມສໍາລັບຄ່າທີ່ຊ້ໍາກັນ, ເຮັດດັ່ງຕໍ່ໄປນີ້:
- ກໍານົດວ່າຖັນໃດມີຄ່າຊໍ້າກັນທີ່ເປັນໄປໄດ້.
- ໃຊ້ COUNT(*) ໃນຖັນເລືອກລາຍການເພື່ອສະແດງລາຍການຖັນເຫຼົ່ານັ້ນ.
- ຖັນທີ່ລະບຸໄວ້ໃນ GROUP BY clause.
- ຂໍ້ HAVING ກຳນົດຈຳນວນການຊ້ຳກັນຫຼາຍກວ່າ 1.
ກັ່ນຕອງຂໍ້ມູນຊໍ້າກັນ
ຖ້າທ່ານຕ້ອງການອ່ານຂໍ້ມູນທີ່ເປັນເອກະລັກ, ທ່ານສາມາດນໍາໃຊ້ຄໍາສໍາຄັນ DISTINCT ໃນຄໍາສັ່ງ SELECT ເພື່ອກັ່ນຕອງຂໍ້ມູນທີ່ຊ້ໍາກັນ.
mysql> SELECT DISTINCT last_name, first_name -> FROM person_tbl;
ທ່ານຍັງສາມາດໃຊ້ GROUP BY ເພື່ອອ່ານຂໍ້ມູນທີ່ເປັນເອກະລັກຈາກຕາຕະລາງ:
mysql> SELECT last_name, first_name -> FROM person_tbl -> GROUP BY (last_name, first_name);
ຂໍ້ມູນຊໍ້າກັນ
ຖ້າທ່ານຕ້ອງການລຶບຂໍ້ມູນທີ່ຊ້ໍາກັນໃນຕາຕະລາງຂໍ້ມູນ, ທ່ານສາມາດນໍາໃຊ້ຄໍາສັ່ງ SQL ຕໍ່ໄປນີ້:
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex -> FROM person_tbl; -> GROUP BY (last_name, first_name, sex); mysql> DROP TABLE person_tbl; mysql> ALTER TABLE tmp RENAME TO person_tbl;
ແນ່ນອນ, ທ່ານຍັງສາມາດເພີ່ມ INDEX (ດັດສະນີ) ແລະ PRIMAY KEY (ກຸນແຈຕົ້ນຕໍ) ໃນຕາຕະລາງຂໍ້ມູນເພື່ອລຶບບັນທຶກທີ່ຊ້ໍາກັນຢູ່ໃນຕາຕະລາງ.ວິທີການດັ່ງລຸ່ມນີ້:
mysql> ALTER IGNORE TABLE person_tbl -> ADD PRIMARY KEY (last_name, first_name);
ຫວັງວ່າ ບົດຄວາມ "ວິທີການສອບຖາມ ແລະ ປະມວນຜົນຂໍ້ມູນທີ່ຊໍ້າກັນໃນ MySQL? ການກັ່ນຕອງ ແລະ ການລຶບຄຳສັ່ງຂໍ້ມູນທີ່ຊໍ້າກັນ" ທີ່ແບ່ງປັນໃນ ບລັອກຂອງ Chen Weiliang ( https://www.chenweiliang.com/ ) ຈະເປັນປະໂຫຍດຕໍ່ທ່ານ.
ຮູ້ສຶກວ່າບໍ່ເສຍຄ່າທີ່ຈະແບ່ງປັນລິ້ງຂອງບົດຄວາມນີ້: https://www.chenweiliang.com/cwl-499.html
