प्रौद्योगिकी साझेदारी

MySQL sql_safe_updates पैरामीटर्

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

sql_safe_updates MySQL मध्ये एकः सिस्टम् चरः अस्ति यः नियन्त्रयति यत् MySQL सर्वरः UPDATE अथवा DELETE कथनेषु अद्यतनं वा विलोपनं वा कार्यं अनुमन्यते वा यत् KEY अथवा LIMIT खण्डस्य उपयोगं न करोति यदा एषः चरः ON इति सेट् भवति तदा MySQL UPDATE अथवा DELETE कथनानि अङ्गीकुर्वति ये सारणीयां बहूनां पङ्क्तयः प्रभावितं कर्तुं शक्नुवन्ति, यावत् एते कथनानि स्पष्टतया WHERE खण्डे अथवा the LIMIT clause to प्रभावितपङ्क्तयः सीमितं कुर्वन्तु ।

अस्य उद्देश्यं लापरवाहेन अथवा अशुद्धरूपेण लिखितानां SQL-कथनानां कारणेन बृहत्मात्रायां आँकडानां आकस्मिकहानिः अथवा परिवर्तनं निवारयितुं भवति ।

sql_safe_updates कथं सेट् करणीयम्

भवान् sql_safe_updates इत्येतत् अनेकधा सेट् कर्तुं शक्नोति:

वैश्विकस्तरः : १.

भवान् MySQL विन्याससञ्चिकां (यथा my.cnf अथवा my.ini, स्वस्य प्रचालनतन्त्रस्य MySQL संस्करणस्य च आधारेण) परिवर्त्य एतत् चरं स्थायिरूपेण सेट् कर्तुं शक्नोति । तथापि, कृपया ज्ञातव्यं यत् विन्याससञ्चिकायां प्रत्यक्षतया sql_safe_updates इत्यस्य सेटिङ्ग् सर्वैः MySQL संस्करणैः समर्थितं न भवितुम् अर्हति, अथवा भिन्नरूपेण विन्यस्तं कर्तुं आवश्यकता भवितुम् अर्हति (यथा प्लग-इन् अथवा अन्यस्य सिस्टम् चरस्य माध्यमेन)
अधिकसामान्यः उपायः अस्ति यत् MySQL इत्यस्य SET GLOBAL स्टेट्मेण्ट् इत्यस्य उपयोगेन रनटाइम् इत्यत्र सेट् करणीयम्, परन्तु एतत् केवलं नूतनानां संयोजनानां प्रभावं करोति । उदाहरणतया:

SET GLOBAL sql_safe_updates = 1;
  • 1

तथापि कृपया ज्ञातव्यं यत् वैश्विकचरानाम् प्रत्यक्षतया सेट् करणाय प्रशासकविशेषाधिकारस्य आवश्यकता भवितुम् अर्हति, तथा च एषः परिवर्तनः विद्यमानसत्रेषु प्रभावं न करिष्यति ।

सत्रस्तरः : १.

भवान् स्वस्य MySQL सत्रे निम्नलिखित SQL कथनं निष्पादयित्वा sql_safe_updates सेट् कर्तुं शक्नोति:

SET SESSION sql_safe_updates = 1;

或者登录时加上--safe-updates 

mysql -uroot -p --safe-updates 
  • 1
  • 2
  • 3
  • 4
  • 5

एतेन वर्तमानसत्रे अनन्तरं क्रियाः प्रभाविताः भवन्ति, परन्तु अन्यसत्रेषु वैश्विकसेटिंग्स् वा न ।

सावधानताएँ

  • sql_safe_updates सक्षमं कृत्वा, यदि भवान् KEY अथवा LIMIT विना UPDATE अथवा DELETE कथनं निष्पादयितुं प्रयतते तर्हि MySQL ऑपरेशनं अङ्गीकृत्य त्रुटिं प्रत्यागमिष्यति ।
(root@localhost)[superdb]> show index from dept;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| dept  |          0 | PRIMARY  |            1 | deptno      | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.13 sec)

(root@localhost)[superdb]> update dept set loc='sz';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • सर्वे MySQL परिनियोजनाः पूर्वनिर्धारितरूपेण sql_safe_updates सक्षमं न कुर्वन्ति । प्रायः विशिष्टसुरक्षाआवश्यकतानां आधारेण दत्तांशकोशप्रशासकेन विकासकेन वा विन्यस्तं भवति ।

  • केषुचित् सन्दर्भेषु, विशिष्टानि बल्क-अद्यतनं वा विलोपनं वा कर्तुं भवद्भिः sql_safe_updates अस्थायीरूपेण निष्क्रियं कर्तुं आवश्यकं भवितुम् अर्हति । अस्मिन् सन्दर्भे, भवान् सत्रस्तरस्य sql_safe_updates = 0 सेट् कर्तुं शक्नोति, परन्तु सावधानं भवतु यत् भवतां SQL कथनानि सुरक्षितानि सन्ति तथा च आकस्मिकरूपेण बृहत् परिमाणं आँकडान् प्रभावितं न कुर्वन्ति

सारांशेन, sql_safe_updates एकं उपयोगी सुरक्षाविशेषता अस्ति यत् अप्रमादेन अथवा त्रुटिकारणात् आँकडाहानिं निवारयितुं साहाय्यं कर्तुं शक्नोति । परन्तु तस्य सुरक्षां सटीकता च सुनिश्चित्य विकासकाः, आँकडाधारप्रशासकाः च स्वस्य SQL कथनेषु अधिकं ध्यानं दातुं अपि आवश्यकम् अस्ति ।

आधिकारिक व्याख्या

यदि 1 इति सेट् भवति तर्हि MySQL UPDATE अथवा DELETE कथनानि निरस्तं करोति ये WHERE खण्डे कुञ्जीम् अथवा LIMIT खण्डे कुञ्जीम् उपयुञ्जते । (विशेषतः, UPDATE कथनेषु WHERE खण्डः भवितुमर्हति यः कीलस्य अथवा LIMIT खण्डस्य, अथवा उभयस्य उपयोगं करोति। DELETE कथनेषु उभयम् अपि भवितुमर्हति।) एतेन UPDATE अथवा DELETE कथनानि गृहीतुं सम्भवं भवति यत्र कीलानां सम्यक् उपयोगः न भवति तथा च तत् सम्भवतः परिवर्तयिष्यति अथवा बहूनां पङ्क्तयः विलोपयन्तु । पूर्वनिर्धारितं मूल्यं 0 अस्ति ।

यदा sql_safe_updates 1 इति सेट् भवति ।

  • सफलतापूर्वकं निष्पादनार्थं अद्यतनकथनं निम्नलिखितशर्तानाम् एकं पूरयितुं भवितुमर्हति:
    • update स्टेट्मेण्ट् where इत्यस्य उपयोगं करोति, तथा च where कण्डिशन् इत्यस्मिन् index स्तम्भः भवितुमर्हति;
    • अद्यतनकथनं सीमायाः उपयोगं करोति;
    • अपडेट् स्टेट्मेण्ट् एकस्मिन् समये where तथा limit इत्यस्य उपयोगं करोति अस्मिन् समये where कण्डिशन् इत्यस्य अनुक्रमणिकास्तम्भस्य आवश्यकता नास्ति;
(root@localhost)[superdb]> update dept set loc='sz' limit 1;
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

(root@localhost)[superdb]> select * from dept;
+--------+------------+---------+
| deptno | dname      | loc     |
+--------+------------+---------+
|     10 | ACCOUNTING | sz      |
|     20 | RESEARCH   | DALLAS  |
|     30 | SALES      | CHICAGO |
|     40 | OPERATIONS | BOSTON  |
+--------+------------+---------+
4 rows in set (0.00 sec)

(root@localhost)[superdb]> update dept set loc='NEW YORK' limit 1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

(root@localhost)[superdb]> update dept set loc='NEW YORK' where deptno=10;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

(root@localhost)[superdb]> update dept set loc='NEW YORK' where deptno=10 limit 2;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • सफलतया निष्पादनार्थं delete स्टेट्मेण्ट् निम्नलिखितशर्ताः पूरयितुं भवितुमर्हति:
    • delete स्टेट्मेण्ट् where कण्डिशन् इत्यस्मिन् index स्तम्भानां अपि उपयोगं करोति ।
    • delete स्टेट्मेण्ट् where कण्डिशन् इत्यस्मिन् index स्तम्भं सीमां च उपयुज्यते ।
    • delete स्टेट्मेण्ट् एकस्मिन् समये where तथा limit इत्येतयोः उपयोगं करोति अस्मिन् समये where कण्डिशन् इत्यस्य अनुक्रमणिकास्तम्भस्य आवश्यकता नास्ति;
(root@localhost)[superdb]> insert into dept values(50,'sz','hk');
Query OK, 1 row affected (0.01 sec)

-- 同时使用 where 和 limit,此时 where 条件中可以有索引列
(root@localhost)[superdb]> delete from dept where deptno=50 limit 1;
Query OK, 1 row affected (0.00 sec)

(root@localhost)[superdb]> insert into dept values(50,'sz','hk');
Query OK, 1 row affected (0.00 sec)

-- 仅使用 where条件中是索引列
(root@localhost)[superdb]> delete from dept where deptno=50;
Query OK, 1 row affected (0.01 sec)

(root@localhost)[superdb]> insert into dept values(50,'sz','hk');
Query OK, 1 row affected (0.00 sec)

-- dname不是索引列,因此无法删除操作
(root@localhost)[superdb]> delete from dept where dname='sz';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 

-- 同时使用 where 和 limit,此时 where 条件中没有索引列
(root@localhost)[superdb]> delete from dept where dname='sz' limit 1;
Query OK, 1 row affected (0.05 sec)

(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

(root@localhost)[superdb]> show index from dept;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| dept  |          0 | PRIMARY  |            1 | deptno      | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.13 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

यदि where कण्डिशन् अनुक्रमणिकास्तम्भं आनयति, परन्तु अनुकूलकः अन्ततः अनुक्रमणिकायाः ​​स्थाने सम्पूर्णं सारणीं स्कैन् कृत्वा चयनं करोति, तर्हि वयं force index([index_name]) इत्यस्य उपयोगं कृत्वा अनुकूलकं वक्तुं शक्नुमः यत् कस्य अनुक्रमणिकायाः ​​उपयोगः करणीयः यत् सम्पूर्णं ताडयितुं सम्भावना न भवति table.