Rumah >pangkalan data >tutorial mysql >Bagaimana untuk menetapkan mod sql lalai MySQL
Mod SQL lalai MySQL 5.7 termasuk ONLY_FULL_GROUP_BY
, STRICT_TRANS_TABLES
, NO_ZERO_IN_DATE
, NO_ZERO_DATE
, ERROR_FOR_DIVISION_BY_ZERO
, NO_AUTO_CREATE_USER
dan NO_ENGINE_SUBSTITUTION
.
Ini ialah penerangan asal dari tapak web rasmi MySQL: "Mod ini telah ditambahkan pada mod SQL lalai dalam MySQL 5.7: Mod ONLY_FULL_GROUP_BY
dan STRICT_TRANS_TABLES
telah ditambahkan dalam MySQL 5.7.5. telah ditambahkan dalam MySQL 5.7.7 Mod NO_AUTO_CREATE_USER
, ERROR_FOR_DIVISION_BY_ZERO
dan NO_ZERO_DATE
telah ditambahkan dalam MySQL 5.7.8 Untuk perbincangan tambahan mengenai perubahan ini pada nilai mod SQL lalai dalam MySQL 5.7 ."NO_ZERO_IN_DATE
SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
SET GLOBAL sql_mode ='ONLY_FULL_GROUP_BY' SET SESSION sql_mode ='ONLY_FULL_GROUP_BY'Di bawah ini kami akan menerangkan secara terperinci mod SQL lalai Bagi yang lain, anda boleh pergi ke laman web rasmi untuk rujukan. docs.oracle.com/cd/E17952_0…Mod SQL lalaiONLY_FULL_GROUP_BYmenetapkan nilai ini, dalam Medan yang muncul selepas SELECT mesti muncul selepas GROUP BY, jika tidak, ralat akan dilaporkan seperti berikut
Ungkapan #3 senarai SELECT tiada dalam klausa GROUP BY dan mengandungi lajur 'blue.shop tanpa agregat. price' yang tidak bergantung secara fungsional pada lajur dalam klausa GROUP BY; ini tidak serasi dengan sql_mode=only_full_group_byYang berikut menggunakan sql_mode lalai MySQL
GRONLY_UP_NOLL_DATE,TRANS_PERTAMA ,NO_ZERO_ TARIKH ,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONKemudian penyataan berikut akan melaporkan ralat, kerana hanya terdapat satu medan selepas GROUP BY, dan SELECT * mencari semua medan, jadi ralat dilaporkan.
SELECT * FROM shop GROUP BY articleMenulis dengan cara ini tidak akan melaporkan ralat
SELECT * FROM shop GROUP BY article , dealer , priceWalau bagaimanapun, adalah mustahil untuk kami menggunakan GROUP BY diikuti oleh semua medan, yang jelas tidak munasabah, jadi ia harus dimatikan dan hanya perlu Alih keluar sahajaSTRICT_TRANS_TABLESMod ketat MySQL boleh mengawal cara mengendalikan nilai yang tidak sah atau hilang dalam pernyataan INSERT atau UPDATE. Nilai mungkin tidak sah atas banyak sebab. Sebagai contoh, ia mungkin mempunyai jenis data yang salah untuk lajur, atau ia mungkin berada di luar julat. Masalah ini berlaku untuk baris baharu yang disisipkan di mana nilai lajur bukan nol tiada dan nilai lalai tidak dinyatakan secara eksplisit dalam takrifan. Sebagai contoh, jika salah satu tetapan medan kami tidak boleh NULL, dan medan data yang kami masukkan ialah NULL, maka ia tidak akan lulus dan ralat akan dilaporkan seperti berikut:
1364 - 'peniaga' medan tidak mempunyai nilai lalaiJadi bagaimana untuk menyelesaikan masalah ini? Saya percaya setiap orang sering menghadapi masalah ini Secara amnya, atribut entiti tidak diberikan nilai apabila kami memasukkan data, yang menyebabkan masalah ini, jadi kami akan menyemak kod dan kemudian menetapkan nilai kepada atribut
, Dengan cara ini, pengesahan tidak akan dilakukan, tetapi sangat tidak disyorkan, kerana kami perlu memastikan integriti data, jadi kami mesti melakukan kerja yang baik pada tahap kod. STRICT_TRANS_TABLES
, maka tidak ada gunanya mendayakan NO_ZERO_IN_DATE. STRICT_TRANS_TABLES
dan NO_ZERO_IN_DATE didayakan, maka ralat akan dilaporkan. STRICT_TRANS_TABLES
INSERT INTO `blue`.`shop` (`article`, `dealer` ,`price`,`date`) VALUES ('商品5', '5', 5.00, '2022-00-00');
1292 - Nilai masa tarikh salah: '2022-00-00' untuk lajur 'tarikh' di baris 1Alih keluar mod ketat
dan STRICT_TRANS_TABLES
Tidak akan ada kesilapan. NO_ZERO_IN_DATE
dan NO_ZERO_DATE digunakan, maka '0000-00-00' tidak boleh dimasukkan. STRICT_TRANS_TABLES
INSERT INTO `blue`.`shop` (`article`,dealer ,`price`,`date`) VALUES ('商品5', '5', MOD(10,0), '0000-00-00');Untuk SELECT, jika dividen adalah 0, NULL akan dikembalikan, begitu juga MOD(N,M).
SELECT price / 0 FROM shop
Mesej ralat: 1365 - Pembahagian dengan 0NO_AUTO_CREATE_USERAnda tidak boleh menggunakan arahan pemberian untuk mencipta pengguna dengan kata laluan kosong.
如果指定了NO_ENGINE_SUBSTITUTION,我们在创建表或者修改表的时候,如果去指定了不存在或者不支持的存储引擎,那么就会报错,无法创建和修改,如果没有配置NO_ENGINE_SUBSTITUTION,那么就会将我们指定的存储引擎(不支持或者不存在)的存储引擎替换为默认的存储引擎,MySQL5.7后的默认存储引擎为InnoDB,所以就会自动设置为InnoDB。
如下我们创建表,将存储引擎设置为一个不存在的InnoDBTest
,因为我们去除了NO_ENGINE_SUBSTITUTION,所以不会报错,并且会替换成默认的InnoDB
创建sql
CREATE TABLE store ( `name` VARCHAR ( 255 ) DEFAULT NULL ) ENGINE = InnoDBTest
查看创建过程
SHOW CREATE TABLE store
结果
CREATE TABLE `store` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW ENGINES;
Atas ialah kandungan terperinci Bagaimana untuk menetapkan mod sql lalai MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!