2015-01-09 12 views
7

Tôi không hoàn toàn hiểu được sự khác biệt giữa trình tự của Oracle và auto_increment của MySql.Sự khác biệt giữa "chuỗi" của Oracle và tính năng Auto_increment của MySql là gì?

Tôi là một anh chàng mysql, nhưng không biết gì về oracle. Tôi hy vọng một người nào đó có thể tỏa sáng một cách nhanh chóng về điều này cho tôi.

Cảm ơn trước, Dan Baughman

+0

Một chuỗi giống như một quy tắc hơn là cột khóa chính – Mihai

+0

Nhanh chóng: Có một số * rất * sự khác biệt đáng kể: AUTO_INCREMENT được gắn với một cột trong một bảng duy nhất, chỉ một bảng cho mỗi bảng. Oracle SEQUENCE thì không. Khi khởi động lại cơ sở dữ liệu, đối với bảng InnoDB, AUTO_INCREMENT được đặt lại thành giá trị cột cao nhất. Oracle SEQUENCE thì không. Một đối tượng Oracle SEQUENCE là một đối tượng hoàn toàn riêng biệt, được thiết kế để tạo ra các giá trị duy nhất, với sự tranh chấp thấp/đồng thời cao. (Đúng là chúng ta có thể mô phỏng MySQL AUTO_INCREMENT bằng SEQUENCE và BEFORE INSERT trigger, nhưng "vào cuối ngày", Oracle SEQUENCE ít giống với AUTO_INCREMENT. – spencer7593

+0

Nếu câu hỏi là: "Chúng ta có thể mô phỏng kiểu AUTO_INCREMENT kiểu MySQL trong Oracle Nếu câu hỏi là về sự khác biệt ... Trình tự Oracle: có thể có giới hạn dưới và trên, có thể có giá trị âm cho tăng, có thể bọc (sau khi đạt đến giới hạn trên, bắt đầu lại mức quy định thấp hơn ràng buộc), các giá trị mới có thể được lấy ra bằng câu lệnh SELECT, không yêu cầu INSERT, một chuỗi đơn có thể được sử dụng bởi vô số các trigger, hàm, thủ tục khác nhau, có thể bị xóa/tái tạo độc lập với bất kỳ bảng nào; giữ lại trên cơ sở dữ liệu khởi động lại, vv – spencer7593

Trả lời

9

Một chuỗi là một đối tượng cơ sở dữ liệu riêng biệt trong Oracle.

Trong MySQL, khi bạn có một cột autoincrement và bạn INSERT một hàng mới trong một bảng, bạn chỉ đơn giản là không đề cập đến cột autoincrement và MySQL đặt nó ở đó. Sau đó, bạn có thể chèn cùng một số vào một bảng khác bằng cách tham chiếu LAST_INSERT_ID().

INSERT INTO person (name, date)        /*MySQL*/ 
       VALUES ('joe', '2015-01-01'); 
INSERT INTO contact (person_id, phone) 
       VALUES (LAST_INSERT_ID(), '555-1212'); 

Trong Oracle, bạn có thể điền cột id bằng cách đề cập đến thuộc tính .nextval của đối tượng chuỗi. Bạn có thể nhận được giá trị chỉ được sử dụng của chuỗi đó bằng cách tham chiếu thuộc tính .currval của nó.

INSERT INTO person (id, name, date)       -- Oracle 
        VALUES (person_seq.nextval, 'joe', '2015-01-01'); 
INSERT INTO contact (id, person_id, phone) 
        VALUES (contact_seq.nextval, person_seq.currval, '555-1212'); 

Mỗi lần bạn đề cập đến thuộc tính .nextval của chuỗi, nó được đảm bảo cung cấp số mới.

Đối tượng chuỗi khá thú vị khi bạn cần các số duy nhất không liên quan trực tiếp đến khóa chính của một số bảng hoặc khác. Bạn có thể làm điều này trong MySQL, nhưng đó là một kludge: Nếu bạn tạo bảng sau:

CREATE TABLE sequence (          /*MySQL*/ 
    sequence_id BIGINT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`sequence_id`) 
) 

Sau đó ban hành các truy vấn này một ba sau khi khác:

INSERT INTO sequence() VALUES();       /*MySQL*/ 
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID(); 
SELECT LAST_INSERT_ID() AS sequence; 

Các truy vấn thứ ba là bảo đảm để quay trở lại một số thứ tự duy nhất. Bảo đảm này giữ ngay cả khi bạn có hàng tá chương trình khách khác nhau được kết nối với cơ sở dữ liệu của bạn. (Truy vấn DELETE chỉ giữ bảng khác vô nghĩa này từ chiếm quá nhiều không gian.)

Với Oracle, bạn tạo chuỗi

create sequence seq           --Oracle 

và sau đó chỉ cần làm

SELECT seq.nextval FROM DUAL         --Oracle 

để có được một số thứ tự mới và đó là nó. Nó cũng đảm bảo tính duy nhất ngay cả với hàng chục chương trình khách hàng được kết nối.

Tương tự, nếu bạn cần giá trị của chuỗi bạn vừa tạo với .nextval, bạn có thể phát lệnh này và nhận lệnh.

SELECT seq.currval FROM DUAL         --Oracle 

Giống như với LAST_INSERT_ID() của MySQL, điều này được xử lý theo phiên để khách hàng khác sử dụng chuỗi sẽ không làm cho bạn nhận được số của họ thay vì số của bạn.

Dòng dưới cùng: cả hai DBMS đều có thể tạo số nguyên duy nhất.Tính toàn vẹn của cả hai lược đồ được thiết kế để được bảo toàn qua các điểm dừng máy chủ và khởi động lại. Trình tự Oracle linh hoạt hơn.

+0

Có thể đáng lưu ý rằng người ta có thể làm 'SELECT seq.currval FROM dual '(nhưng chỉ sau khi đã truy vấn' nextval') để lấy giá trị của chuỗi cuối cùng # được tạo bởi phiên đó. –

+0

@DavidFaber, gợi ý tốt, cảm ơn, tôi đã chỉnh sửa câu trả lời của mình. –

+0

Đây là một kỹ thuật tuyệt vời cho MySQL. Tốt hơn nhiều so với cố gắng giữ một chuỗi trong bảng điều khiển. Cám ơn vì sự gợi ý. – Stenerson

0

Oracle không có cột tự động tăng. Bạn cần phải tạo chuỗi và trước khi chèn trình kích hoạt đọc NEXTVAL từ trình tự và đặt giá trị cho cột

+0

Ok vì vậy vào cuối ngày chức năng giống hệt nhau - trình tự không mạnh hơn auto_increment? –

+1

yes bạn đúng trong oracle bạn phải đặt thêm một chi tiết trên bất kỳ cột số nào của bất kỳ bảng nào để tăng tự động – Mobitips

+1

@DanielBaughman: Nếu takeaway của bạn là "** chức năng giống hệt **", thì đây là câu trả lời kém, bởi vì về cơ bản là * khác nhau *, có một số khác biệt * đáng kể * trong các tính năng. (Vì câu trả lời này không chỉ ra, chúng ta có thể giả lập AUTO_INCREMENT giống như MySQL trong Oracle, và mô phỏng có thể sử dụng hiệu quả đối tượng SEQUENCE để làm điều đó, nhưng Oracle SEQUENCE là * cách * nhiều hơn chỉ là AUTO_INCREMENT. – spencer7593

3

Một chuỗi trong Oracle DB là một thực thể riêng biệt mà bạn có thể truy cập trong truy vấn của mình để nhận/tăng giá trị và bạn có thể sử dụng cùng một trình tự với nhiều hơn một bảng/trường.

Tăng tự động trong MySQL được liên kết với một trường đơn lẻ trong bảng và được sử dụng để xác định giá trị của trường đó, khi nó không được đưa ra trong truy vấn chèn.

+1

Không chỉ "trong lý thuyết" chúng ta có thể sử dụng cùng một SEQUENCE cho nhiều bảng, chúng ta cũng làm điều đó "trong thực tế". – spencer7593

+0

@ spencer7593 Cảm ơn bạn đã làm rõ, tôi không có nhiều kinh nghiệm với Oracle. –

Các vấn đề liên quan