Əsas səhifə > MySQL, Oracle, Oracle SQL > Altering Table Definitions after Creation Oracle vs. MySQL

Altering Table Definitions after Creation Oracle vs. MySQL

Bu yazıda sizlərlə ALTER statement-lərə baxacıq.
1 nümunə Oracle-dan daha sonra da 1 nümunə MySQL-dən.

Mövcud cədvəlimiz hər 2 DB-də eynidir.

Adding Columns:

-- Oracle

-- Syntax 1

alter table t1 add column address varchar2(25) not null;
>>>
Error starting at line : 3 in command -
alter table t1 add column address varchar2(25) not null
Error report -
SQL Error: ORA-00904: : invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:


-- Syntax 2

alter table t1 add address varchar2(25) not null;
>>>
Error starting at line : 5 in command -
alter table t1 add address varchar2(25) not null
Error report -
SQL Error: ORA-01758: table must be empty to add mandatory (NOT NULL) column
01758. 00000 -  "table must be empty to add mandatory (NOT NULL) column"
*Cause:    
*Action:

Burdan çıxan nəticə budur ki, 1ci Syntax növünü Oracle dəstəkləmir. 2-ci olaraq isə NOT NULL constraint-li column-u məlumatlar olan cədvələ daxil etmək mümkün deyil. ERROR-dan da aydın görünür:

table must be empty to add mandatory (NOT NULL) column

Eyni testler MySQL-də:

-- MySQL

-- Syntax 1

mysql> alter table t1 add column address varchar(25) not null;
Query OK, 3 rows affected (0.45 sec)
Records: 3  Duplicates: 0  Warnings: 0

-- Syntax 2

mysql> alter table t1 add address2 varchar(25) not null;
Query OK, 3 rows affected (0.28 sec)
Records: 3  Duplicates: 0  Warnings: 0

Gördüyümüz kimi hər 2 syntax tipi dəstəklənir və hətta boş olmayan cədvələ not null column əlavə edə bilirik. Möcüzəli şəkildə NOT NULL olan column-a 0 uzunluqlu boş məlumat daxil edilib:

mysql> select char_length(address),char_length(address2) from t1;
+----------------------+-----------------------+
| char_length(address) | char_length(address2) |
+----------------------+-----------------------+
|                    0 |                     0 |
|                    0 |                     0 |
|                    0 |                     0 |
+----------------------+-----------------------+
3 rows in set (0.00 sec)

Ən sonda onu qeyd edək ki, Oracle düzgün syntax zamanı column əlavə etdikdə , həmin column dataları NULL olur:

-- Oracle

select nvl(address,'null məlumat') from t1;
>>>
null məlumat
null məlumat
null məlumat

Dropping Columns:

-- Oracle

alter table t1 drop column address;

-- MySQL

alter table t1 drop column address;

Eyni syntax eyni funksionallıq.

Renaming Columns:

-- Oracle

alter table t1 rename column address to address2;
>>>
table T1 altered.

desc t1;
>>>
Name     Null Type         
-------- ---- ------------ 
ID1           NUMBER       
NAME1         VARCHAR2(25) 
NAME_ID       NUMBER       
ADDRESS2      VARCHAR2(25) 

Rename olunan zaman column definition olduğu kimi qalır.
MySQL-də rename syntax yoxdur onun əvəzinə change var:

-- MySQL

alter table t1 change address address2 varchar(25) not null;

Marking Columns as unused

-- Oracle

alter table t1 set unused column address2;

desc t1;

Name    Null Type         
------- ---- ------------ 
ID1          NUMBER       
NAME1        VARCHAR2(25) 
NAME_ID      NUMBER

Həqiqətən də unused etdi. Hətta describe-da belə görsənmədi bu column.

MySQL-də belə bir syntax yoxdur.

Making table as read-only:


-- Oracle

alter table t1 read only;

MySQL-də belə bir syntax yoxdur. Onun əvəzinə USER-ə yalnızca SELECT grant verməklə cədvəli privilege vasitəsilə read only edə bilərsiniz.

Modifying columns:
Daha bir maraqlı halı göstərək. Oracle-da boş olmayan column uzunluğunu azaltmaq istədikdə ERROR verərək bunun qarşısını alır.

Deyək ki bizim cədvəlimiz aşağıdakı kimidir:

-- Oracle

desc t1;

Name    Null Type         
------- ---- ------------ 
ID1          NUMBER       
NAME1        VARCHAR2(30) 
NAME_ID      NUMBER 

Və NUMBER tipin uzunluğunu azaltmağa çalışaq:

-- Oracle

alter table t1 modify id1 number(4,0);
>>>
Error starting at line : 3 in command -
alter table t1 modify id1 number(4,0)
Error report -
SQL Error: ORA-01440: column to be modified must be empty to decrease precision or scale
01440. 00000 -  "column to be modified must be empty to decrease precision or scale"
*Cause:    
*Action:

Eyni halı MySQL-də test edək.

-- MySQL

mysql> desc t1;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name    | varchar(25)      | YES  |     | NULL    |                |
| name_id | int(11)          | YES  |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> alter table t1 modify id tinyint not null auto_increment;
Query OK, 3 rows affected (1.23 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> desc t1;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | tinyint(4)  | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10) | YES  |     | NULL    |                |
| name_id | int(11)     | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Query OK..MySQL-də Heç bir error çıxmadı dolayısı ilə Bu anda çox diqqətli olmaq lazımdır mövcud halda, data səssizcə truncate oluna bilər.
Lakin maraqlı hal bundan ibarətdir ki, Oracle varchar tipində error çıxartmır MySQL kimi.

-- Oracle
-- 1
alter table t1 modify name1 varchar2(25);

desc t1;
>>>
Name    Null Type         
------- ---- ------------ 
ID1          NUMBER       
NAME1        VARCHAR2(25) 
NAME_ID      NUMBER    

-- 2

alter table t1 modify name1 varchar2(15);

desc t1;
>>>
Name    Null Type         
------- ---- ------------ 
ID1          NUMBER       
NAME1        VARCHAR2(15) 
NAME_ID      NUMBER  

Indi isə mövcud data uzunluğundan daha aşağı bir uzunluq ilə cədvəlimizi alter etməyə çalışaq:

-- Oracle

select length(name1) from t1;
>>>
9
5
5

-- 9-dan kiçik qiymət ilə alter

alter table t1 modify name1 varchar2(7);
>>>

alter table t1 modify name1 varchar2(7)
Error report -
SQL Error: ORA-01441: cannot decrease column length because some value is too big
01441. 00000 -  "cannot decrease column length because some value is too big"
*Cause:    
*Action:

Oracle çox gözəl şəkildə hər hansı data-nın itirilməsinin qarşısını alır.
Eyni testi MySQL-də edək.

-- MySQL

mysql> select * from t1;
+----+-----------+---------+
| id | name      | name_id |
+----+-----------+---------+
|  1 | shahriyar |       1 |
|  2 | orxan     |       2 |
|  3 | elvin     |       3 |
+----+-----------+---------+
3 rows in set (0.00 sec)


mysql> alter table t1 modify name varchar(7);
Query OK, 3 rows affected, 1 warning (1.22 sec)
Records: 3  Duplicates: 0  Warnings: 1

mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from t1;
+----+---------+---------+
| id | name    | name_id |
+----+---------+---------+
|  1 | shahriy |       1 |
|  2 | orxan   |       2 |
|  3 | elvin   |       3 |
+----+---------+---------+
3 rows in set (0.00 sec)

Çox təəssüf ki data-mız itirildi. Default MySQL installation işlədikdə bu kimi hallara diqqət yetirmək lazımdır.
Yuxarıdakı halın qarşısını almaq üçün my.cnf faylında sql_mode-u təyin etmək lazımdır. Ya da ki, session olaraq dəyişə bilərsiz.

mysql> set @@sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

mysql> alter table t1 modify name varchar(7);
ERROR 1265 (01000): Data truncated for column 'name' at row 1

Ümumiyyətlə MySQL-i install etdikdən sonra onu strict mode-a keçirmək məsləhətdir.

Təşəkkürlər😉

Kateqoriyalar: MySQL, Oracle, Oracle SQL
  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: