SQLite

Euler

Administrator
Thành viên BQT
1. Download và cài đặt.
Các bạn vào đây tiến hành download:
Mã:
https://www.sqlite.org/
Bạn cần đăng nhập để thấy đính kèm


Tôi đang dùng Win10 64bit nên tôi tìm tới:
Precompiled Binaries for Windows => sqlite-tools-win32-x86-3270200.zip

Bạn cần đăng nhập để thấy đính kèm


Bạn có thể giải nén ra đâu đó tùy ý. Nhưng tôi sẽ lưu trữ ở đường dẫn như sau:
Mã:
c:¥pg¥sqlite3
Bạn cần đăng nhập để thấy đính kèm

Để chạy lệnh command cài đặt database thì chúng ta dùng sqlite3.exe, để so sánh sự khác nhau giữa hai cơ sở dữ liệu thì dùng sqldiff.exe, để phân tích database ta dùng sqlite3_analyzer.exe , do đó mà chúng ta có 3 file.
 

Euler

Administrator
Thành viên BQT
2. Tạo cơ sở dữ liệu:
Mở cmd chạy với quyền admin:
Chạy lệnh DOS sau để di chuyển con trỏ về thư mục hiện hành:
Mã:
cd C:\pg\sqlite3
Bạn cần đăng nhập để thấy đính kèm


Để tạo database ta chạy lệnh DOS sau:
Mã:
sqlite3 Tên_Cơ_Sở_Dữ_Liệu
Nếu tên cơ sở dữ liệu chưa tồn tại thì nó tạo ra file mới theo tên mà bạn chỉ định ở trên. Nếu tên này tồn tại rồi thì nó sẽ kết nối tới cơ sở dữ liệu này.
Bây giờ tôi sẽ tạo database có tên là: sampledb.sqlite3 , do đó tôi chạy lệnh DOS sau:
Mã:
sqlite3 sample.sqlite3
Chú ý bạn có thể chọn tên tùy ý, ví dụ là : tuhocvba.db
Lúc này thì trong folder hiện hành chưa thấy file database nào mặc dù nó đã được tạo mới. Bởi vì database thì cần tối thiểu 1 table. Cũng như file excel thì tối thiểu phải có 1 sheet.
Bạn cần đăng nhập để thấy đính kèm


Chạy tiếp lệnh DOS sau để tạo table cho database:
Mã:
create table username(id, name);
Bây giờ thì nhìn vào trong folder đã có file database tạo ra rồi.
Nếu không muốn thao tác gì nữa thì gõ lệnh DOS sau:
Mã:
.exit
Bạn cần đăng nhập để thấy đính kèm

Bằng thao tác này, ta đã ngắt kết nối với file cơ sở dữ liệu vừa được tạo ra.
Do ta không chỉ định nơi lưu file database, do đó file này được tạo ra sẽ nằm cùng thư mục với file sqlite3.exe
Bạn cần đăng nhập để thấy đính kèm


(Chú ý: Diễn đàn THVBA sẽ dẫn nguồn bài viết sau khi toàn bộ topic này được dịch xong)
 

vbano1

SMod
Thành viên BQT
3. Download sqlite3.dll
SQlite có thể dùng command nhưng để có thể sử dụng cho nhiều ứng dụng khác thì không phải là sqlite3.exe mà chúng ta sẽ sử dụng sqlite3.dll.
Bạn truy cập trang sau:
Mã:
https://www.sqlite.org/
Bạn cần đăng nhập để thấy đính kèm

Vì tôi dùng win 10 64bit nên tôi sẽ tìm tới:
Precompiled Binaries for Windows => sqlite-dll-win64-x64-3270200.zip
Bạn cần đăng nhập để thấy đính kèm


Bạn có thể lưu trữ file dll này ở đâu tùy ý.

4. Tài liệu tra cứu
Vẫn ở trang trên:
Bạn cần đăng nhập để thấy đính kèm


Giao diện hiện ra:
Bạn cần đăng nhập để thấy đính kèm


Ví dụ ta tìm tới: Programming Interfaces => SQL Syntax
Bạn cần đăng nhập để thấy đính kèm


Chúng ta có thể tìm thấy các lệnh SQL có thể sử dụng được trong SQLite:
Bạn cần đăng nhập để thấy đính kèm


5. Tải tài liệu thuyết minh:
Để có thể tra cứu mà không cần internet, tốt nhất chúng ta sẽ tải về máy tính:
Bạn cần đăng nhập để thấy đính kèm


Documentation => sqlite-doc-3270200.zip
Bạn cần đăng nhập để thấy đính kèm

Bạn có thể lưu trữ ở đâu tùy ý. Tuy nhiên tôi sẽ tạo một thư mục doc và lưu chúng trong này:
Bạn cần đăng nhập để thấy đính kèm


Tìm tới file index.html và mở ra thử xem sao nhé.
Bạn cần đăng nhập để thấy đính kèm
 
B

bvtvba

Guest
6. Kiểu dữ liệu có thể dùng trong SQLite
Việc tạo bảng (Table) trong SQLite không bắt buộc phải chỉ định kiểu dữ liệu cho mỗi trường dữ liệu. Tuy nhiên cho dù không chỉ định, thì dữ liệu khi nạp vào bảng, dù thế nào đi nữa cũng chỉ có thể là 5 khả năng dưới đây.
  • NULL Giá trị NULL
  • INTEGER Kiểu số nguyên. Là 1, 2, 3, 4, 6, or 8 byte
  • REAL Kiểu số thực. 8 byte.
  • TEXT Chuỗi ký tự. UTF-8, UTF-16BE or UTF-16-LE
  • BLOB Binary Large OBject. Dữ liệu như nào thì giữ nguyên y xì và nạp vào.

Chả hạn nếu giá trị nhập vào chứa dấu ' thì bạn nên nghĩ tới việc định nghĩa trường dữ liệu này nên là TEXT. Nếu là số không chứa dấu phẩy, thì có thể nghĩ tới kiểu số nguyên INTEGER. Nếu là số chứa dấu phẩy thì nên dùng kiểu số thực REAL.

Tạo bảng dữ liệu cùng với việc định nghĩa kiểu dữ liệu cho các trường dữ liệu:
Mã:
create table personal(id integer, name text);
Xin chú ý rằng, việc chỉ định kiểu dữ liệu là không bắt buộc nhưng bạn có thể chỉ định kiểu dữ liệu cho mỗi trường dữ liệu.

Kiểu dữ liệu mà bạn có thể chỉ định cho các trường dữ liệu khi tạo Table là:
  • TEXT
  • NUMERIC
  • INTEGER
  • REAL
  • NONE
Lưu ý là cho dù có chỉ định đi chăng nữa, thì kiểu dữ liệu thế nào cũng sẽ được nạp vào trường dữ liệu sau khi nó được chuyển đổi. Cụ thể như sau:
(1)TEXT là kiểu dữ liệu được chỉ định cho trường dữ liệu. Lúc này nếu bạn nạp vào là INTEGER hay REAL thì nó cũng sẽ bị chuyển thành TEXT.
(2)NUMERIC là kiểu dữ liệu được chỉ định cho trường dữ liệu. Lúc này nếu bạn nạp vào là TEXT. Nó sẽ thử chuyển thành INTEGER hoặc REAL. Nếu thành công thì nó sẽ cất dữ liệu này vào. Nếu thất bại thì nó cữ giữ nguyên dạng TEXT mà cất vào.
(3)INTEGER là kiểu dữ liệu được chỉ định cho trường dữ liệu. Lúc này nếu bạn nạp vào là một số thực chả hạn là 34.0 thì nó sẽ chuyển thành INTEGER . Hoặc dữ liệu TEXT có dạng "34.0" thì nó vẫn chuyển được thành INTEGER và cất vào.
(4)REAL là kiểu dữ liệu được chỉ định cho trường dữ liệu. Lúc này nếu bạn nạp vào là INTEGER thì nó sẽ chuyển thành REAL và nạp vào.
(5)NONE: Nếu định nghĩa thế này thì dữ liệu sẽ không bị chuyển đổi.

Phương pháp chỉ định kiểu dữ liệu cho trường dữ liệu.
Như đã nói, bạn có 5 dạng dữ liệu có thể định nghĩa cho các trường dữ liệu khi tạo table:
[TEXT][NUMERIC][INTEGER][REAL][NONE]
Đối với INTEGER thì có thể viết ngắn gọn là int.
Ví dụ:
Mã:
create table personal(id int, name text);
Kiểu chuỗi ký tự như CHAR , CLOB , TEXT thì sẽ trở thành kiểu TEXT.
Mã:
create table personal(id int, name varchar);
Trường hợp kiểu dữ liệu chứa chuỗi ký tự kiểu BLOB , hoặc bạn không chỉ định gì thì khi đó mặc định sẽ là NONE.

Trường hợp kiểu dữ liệu chứa các kiểu sau: REAL , FLOA , DOUB, thì khi đó nó sẽ trở thành kiểu REAL.

Nếu không có điều nào ở trên là đúng thì nó sẽ trở thành kiểu NUMERIC.
 

giaiphapvba

Administrator
Thành viên BQT
7. Phương pháp thực thi lệnh SQL:
Tôi đã nạp sẵn dữ liệu vào database rồi. Bước này sẽ có hướng dẫn sau. Nào, bây giờ chúng ta hãy làm quen với việc thực thi SQL.
Chạy DOS với quyền admin.
Di chuyển con trỏ tới thư mục hiện hành bằng lệnh sau:
Mã:
cd C:\pg\sqlite3
Tiếp theo:
Để kết nối tới cơ sở dữ liệu ta có lệnh như sau:
Mã:
sqlite3 DatabaseName
Cụ thể tôi chạy lệnh sau:
Mã:
sqlite3 sample.sqlite3
Bạn cần đăng nhập để thấy đính kèm


Tới đây thì bạn có thể thực thi lệnh SQL tùy ý.
Bây giờ tôi sẽ chạy thử lệnh sau:
Mã:
.show
Bạn cần đăng nhập để thấy đính kèm


Thực thi lệnh SQL
Tôi thực thi lệnh sau để truy xuất toàn bộ thông tin trong table username.
Mã:
select * from username;
Chú ý cuối mỗi lệnh SQL đều phải có dấu chấm phẩy ;
Bạn cần đăng nhập để thấy đính kèm


Trường hợp lệnh SQL quá dài:
Mã:
select id, name  from username where id between 1 and 3 order by name desc;
Việc này có thể làm được, nhưng gõ quá là khổ sở. Khi đó bạn hãy ấn phím Enter để xuống dòng.
Bạn cần đăng nhập để thấy đính kèm


Chú ý: Bạn có thể ấn phím Enter nhiều lần để xuống dòng như minh họa dưới đây:
Bạn cần đăng nhập để thấy đính kèm
 

Euler

Administrator
Thành viên BQT
8. Viết comment trong SQL
Như vậy ở phần trước chúng ta đã bắt đầu tập làm quen với việc viết lệnh SQL để làm việc với SQLite.
Cũng giống như chúng ta viết code, đôi khi chúng ta muốn viết comment để diễn giải nghĩa thì làm thế nào?
Ta có hai cách viết comment như sau:
Mã:
-- commment
/* comment */
Cách viết đầu tiên có tác dụng phớt lờ từ vị trí đó tới cuối dòng.
Cách viết thứ hai có tác dụng phớt lờ từ vị trí /* cho tới khi nào gặp */
Ví dụ:
Mã:
select * from personal; -- List
Mã:
select * from /* List table */ personal;
 
B

bvtvba

Guest
9. Tạo và kết nối với cơ sở dữ liệu
Như mục 2 đã giới thiệu. Ta có cấu trúc lệnh là:
Mã:
sqlite3 DatabaseName
Ví dụ:
Mã:
sqlite3 myfriend.sqlite3
Trường hợp myfriend.sqlite3 chưa tồn tại thì nó sẽ tạo ra file mới. Trường hợp mà đã tồn tại rồi thì nó sẽ kết nối tới.
Mã:
create table TableName(id, name);
Để tạo Table và trường dữ liệu trong Table.
Để ngắt kết nối ta dùng:
Mã:
.exit
Như các bài trước đã nói, nếu không chỉ định đường dẫn cụ thể, thì file database mới tạo ra sẽ nằm cùng thư mục với file sqlite3.exe, do đó nếu bây giờ tôi muốn chỉ định rõ ràng đường link để lưu file thì cấu trúc là:
Mã:
sqlite3 c:¥test¥sample.sqlite3
Như đã nói, bạn có thể chỉ định tên cơ sở dữ liệu tùy ý, kể cả không chỉ định phần mở rộng (đuôi) của file. Dưới đây là các tên thường dùng:
Mã:
myfriend
myfriend.db
myfriend.sqlite
myfriend.sqlite3
Để kiểm tra cơ sở dữ liệu đã tạo ra trước đó có những table nào, đầu tiên tôi cần kết nối tới cơ sở dữ liệu:
Mã:
sqlite3 myfriend.sqlite3
Tiếp theo gõ lệnh là:
Mã:
.tables
 

Euler

Administrator
Thành viên BQT
10. Lưu ý về từ khóa trong SQLite
Nếu chúng ta tạo một table có tên là select thì code dưới đây không hoạt động được.
Mã:
create table select(id, name);
Bạn cần đăng nhập để thấy đính kèm

Đã có báo lỗi. Do select là một từ khóa. Để sử dụng tên riêng mà không xảy ra hiểu lầm đây là từ khóa lệnh, ta có 4 cách sau:
Mã:
'keyword'
"keyword"
[keyword]
`keyword`
Tôi cho rrawngcachs 1 hoặc 3 là tiện lợi nếu sau này gõ code VBA.
Bây giờ tôi sẽ thử:
Mã:
create table 'select'(id, name);
Bạn cần đăng nhập để thấy đính kèm

Thành công rồi.
Sau đây tôi xin phép liệt kê các từ khóa trong SQLite:
Mã:
ABORT
ACTION
ADD
AFTER
ALL
ALTER
ANALYZE
AND
AS
ASC
ATTACH
AUTOINCREMENT
BEFORE
BEGIN
BETWEEN
BY
CASCADE
CASE
CAST
CHECK
COLLATE
COLUMN
COMMIT
CONFLICT
CONSTRAINT
CREATE
CROSS
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATABASE
DEFAULT
DEFERRABLE
DEFERRED
DELETE
DESC
DETACH
DISTINCT
DO
DROP
EACH
ELSE
END
ESCAPE
EXCEPT
EXCLUSIVE
EXISTS
EXPLAIN
FAIL
FILTER
FOLLOWING
FOR
FOREIGN
FROM
FULL
GLOB
GROUP
HAVING
IF
IGNORE
IMMEDIATE
IN
INDEX
INDEXED
INITIALLY
INNER
INSERT
INSTEAD
INTERSECT
INTO
IS
ISNULL
JOIN
KEY
LEFT
LIKE
LIMIT
MATCH
NATURAL
NO
NOT
NOTHING
NOTNULL
NULL
OF
OFFSET
ON
OR
ORDER
OUTER
OVER
PARTITION
PLAN
PRAGMA
PRECEDING
PRIMARY
QUERY
RAISE
RANGE
RECURSIVE
REFERENCES
REGEXP
REINDEX
RELEASE
RENAME
REPLACE
RESTRICT
RIGHT
ROLLBACK
ROW
ROWS
SAVEPOINT
SELECT
SET
TABLE
TEMP
TEMPORARY
THEN
TO
TRANSACTION
TRIGGER
UNBOUNDED
UNION
UNIQUE
UPDATE
USING
VACUUM
VALUES
VIEW
VIRTUAL
WHEN
WHERE
WINDOW
WITH
WITHOUT
 
B

bvtvba

Guest
11. Xác nhận đang kết nối với cơ sở dữ liệu:
Cấu trúc lệnh:
Mã:
.databases
Nào bây giờ chúng ta sẽ thử nhé:
Đầu tiên tôi cho kết nối tới cơ sở dữ liệu:
Mã:
sqlite3 myfriend.sqlite3
Sau khi đã kết nối rồi, tôi sẽ thực thi lệnh sau:
Mã:
.databases
Trên màn hình sẽ hiện ra là:
Mã:
main: c:¥pg¥sqlite3¥myfriend.sqlite3
Có nghĩa là file database này đang được kết nối.
Sau từ khóa main là tên database : c:¥pg¥sqlite3¥myfriend.sqlite3
 

Euler

Administrator
Thành viên BQT
12. Backup và xóa dữ liệu
Việc đơn giản mà các bạn có thể nghĩ tới là copy file database lưu dưới cái tên khác.
Với việc xóa database thì cũng chỉ cần delete file đó đi thôi.

13. Giải phóng vùng trống VACUUM
Mã:
vacuum;
Khi bạn thêm dữ liệu thì database cũng tăng dung lượng.
Nhưng đôi khi chúng ta xóa dữ liệu mà chẳng thấy database giảm dung lượng gì cả.
Điều đó có nghĩa là kích thước file đang không tỷ lệ với data mà nó chứa bên trong. Nếu để ý tới dung lượng file database thì các bạn cần sử dụng lệnh VACUUM.
Việc sử dụng câu lệnh VACUUM sẽ giúp data được sắp xếp lại, từ đó vùng trống cũng không còn, dung lượng file sẽ giảm đi.
Chú ý đối tượng của câu lệnh này chỉ là database main mà các bạn đang kết nối.
Ngoài ra, với table không thiết định khóa chính (INTEGER PRIMARY KEY ) thì ROWID có thể bị thay đổi.
Hãy xem cơ sở dữ liệu dưới đây có dung lượng 49,152 bytes.
Bạn cần đăng nhập để thấy đính kèm


Bây giờ tôi sẽ kết nối với database và xóa đi 1 table.
Bạn cần đăng nhập để thấy đính kèm


Tôi kiểm tra dung lượng file database và chẳng thấy thay đổi gì:
Bạn cần đăng nhập để thấy đính kèm


Xóa table thì không có chuyện database ngay lập tức giảm dung lượng đâu. Nào bây giờ hãy thử thực thi lệnh sau:
Mã:
vacuum;
Bạn cần đăng nhập để thấy đính kèm


Bây giờ tôi sẽ kiểm tra dung lượng:
Bạn cần đăng nhập để thấy đính kèm


Dung lượng Database đã giảm còn 16,384 bytes.
Khi sử dụng lệnh VACUUM thì vùng không sử dụng sẽ được giải phóng, nhờ thế mà database sẽ giảm dung lượng.
 

tuhocvba

Administrator
Thành viên BQT
14. Nạp dữ liệu vào database
Đầu tiên tôi cần kết nối tới cơ sở dữ liệu:
Mã:
sqlite3 sample.sqlite3
Thú thực là file nhận của các bạn, chẳng biết các bạn tạo ra những table nào rồi, nên mình kiểm tra.
Mã:
.tables
Bạn cần đăng nhập để thấy đính kèm

Rồi tới đây thì nhớ rồi. Bây giờ mình sẽ nạp giá trị vào table username.
Mã:
 insert into username values(null,"NhanSu1");
 insert into username values(3.14,"vothanhthu1");
 insert into username values("Euler","Euler1");
Rồi, bây giờ mình sẽ kiểm tra nhé:
Mã:
select * from username;
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


Rồi, bây giờ mình sẽ kiểm tra kiểu dữ liệu của các trường dữ liệu id, name trong table username nhé:
Mã:
select id, typeof(id), name, typeof(name) from username;
Bạn cần đăng nhập để thấy đính kèm

Ký tự rỗng, null thì là kiểu NULL, số nguyên thì là kiểu INTEGER , số chứa dấu phẩy (3.14) thì là kiểu số thực REAL, ký tự thì là kiểu TEXT.
Ứng với mỗi giá trị mà ta nạp vào thì kiểu dữ liệu tương ứng tự động được thiết định.

Thật là lộn xộn.

Bây giờ tôi sẽ tạo table mới và chỉ định kiểu dữ liệu cho các trường dữ liệu.
Mã:
create table test2(val1 text, val2 numeric);
Bây giờ tôi sẽ nạp giá trị cho table.
Mã:
insert into test2 values('Summer', 'Summer');
insert into test2 values(48, 48);
insert into test2 values('72', '72');
insert into test2 values(39.24, 39.24);
insert into test2 values('0.17', '0.17');
insert into test2 values(null, null);
Bây giờ tôi sẽ kiểm tra kiểu dữ liệu:
Mã:
select val1, typeof(val1), val2, typeof(val2) from test2;
Bạn cần đăng nhập để thấy đính kèm

Ta nhận thấy rằng nếu chỉ định là TEXT , thì dù là số được nạp vào nó vẫn là TEXT , không bị thay đổi. Riêng giá trị NULL nếu nạp vào thì dù thế nào nó vẫn là NULL .
Nếu chỉ định là NUMERIC , thì đầu tiên nó sẽ thử chuyển thành INTEGER, nếu thất bại nó sẽ thử chuyển thành REAL. Nếu thất bại thì chuyển thành kiểu TEXT. Riêng giá trị NULL thì dù thế nào nó vẫn là NULL.
Lần này tôi đã thử nghiệm kiểu TEXT và NUMERIC. Tùy từng trường hợp kiểu dữ liệu được thiết định cho trường dữ liệu như nào, và dữ liệu được nạp vào nó ra sao mà nó có thể biến đổi, đây là điều mà chúng ta vừa học cách xác nhận kiểm tra.
 

Euler

Administrator
Thành viên BQT
15. Xử lý với dấu nháy đơn
Giả sử như tôi có chuỗi ký tự có dấu nháy đơn như sau:
Mã:
'chuoi ky tu abc'
Bây giờ nạp thông tin này vào bảng thì phải làm như thế nào?
Nào, bây giờ tôi sẽ tạo ra một table để thực nghiệm nhé.
Mã:
create table test(val text);
Bây giờ tôi sẽ nạp giá trị sau vào table :
Mã:
I'm a student.
Mã:
insert into test values('I'm a student.');
Vừa gõ Enter một cái thì nó thành ra như thế này:
Bạn cần đăng nhập để thấy đính kèm

Vì trước đó có dấu nháy đơn (') và thế nên là nó sẽ tìm tới dấu nháy đơn tiếp theo để đoán khi nào kết thúc chuỗi ký tự.
Vậy là không ổn rồi.
Tôi làm lại như sau:
Mã:
insert into test values('I''m a student.');
Có vẻ như không có vấn đề gì.
Tôi kiểm tra bằng lệnh:
Mã:
select * from test;
Bạn cần đăng nhập để thấy đính kèm

Ta cần có thêm một dấu nháy đơn bên cạnh một dấu nháy đơn mà ta muốn nó hiển thị trong văn bản, để nó hiểu rằng, dấu nháy đơn này không phải là ký tự đặc biệt.
 
B

bvtvba

Guest
16. Tạo Table
Ở các phần trước, để có data thực hành, chúng ta đã tạo Table. Trong phần này ta sẽ bàn cụ thể hơn.
Cấu trúc:
Mã:
CREATE TABLE TableName(ColumnName1, ColumnName2, ...);
Tên Table có thể đặt tùy ý, nhưng hãy tránh từ khóa nhạy cảm như sqlite_ , việc này có thể dẫn tới lỗi không mong muốn.
Cho dù Table nhỏ tới cỡ nào thì tối thiểu cũng phải có một cột (một trường thông tin).

Trong trường hợp có nhiều cột thông tin thì hãy liệt kê và phân tách bởi dấu phẩy (,).

Trong ví dụ dưới đây, tôi tạo table có tên là personal , có hai trường thông tin là idname :
Mã:
create table personal(id, name);
Bạn cần đăng nhập để thấy đính kèm

Trạng thái như thế này nghĩa là tạo xong rồi đấy.

Trường hợp ta tạo table chỉ định kiểu dữ liệu cho các trường thông tin:
Mã:
CREATE TABLE TableName(ColumnName1 TypeData, ColumnName2 TypeData, ...)
Ví dụ:
Mã:
create table personal2(id integer, name text);
Tra cứu các Table đã tạo trong Database :
Mã:
.tables
Bạn cần đăng nhập để thấy đính kèm

Kết quả ở trên cho thấy trong database đang có 2 table : personal và personal2.
 
Sửa lần cuối bởi điều hành viên:
T

thanhphong

Guest
17. Tìm hiểu cấu trúc của Table
Cấu trúc lệnh:
Mã:
select * from sqlite_master;

Đầu tiên tôi kết nối tới cơ sở dữ liệu bằng lệnh:
Mã:
sqlite3 sample.sqlite3
Để dễ quan sát, tôi chuyển chế độ mode line như sau:
Mã:
.mode line
Để điều tra cấu trúc table tôi dùng lệnh sau:
Mã:
select * from sqlite_master;
Bạn cần đăng nhập để thấy đính kèm
 
B

bvtvba

Guest
18. Thay đổi tên table, thêm trường thông tin vào table
Thay đổi tên table:

Mã:
alter table table_old rename to table_new;
Thêm trường thông tin:
Sau khi tạo table cũng như trường thông tin, bạn vẫn có thể thêm trường thông tin mới vào table.
Mã:
ALTER TABLE TableName ADD COLUMN Tên_Cột_Mới[ Kiểu_Dữ_Liệu];
Chú ý khi thêm trường thông tin vào Table, ta phải thỏa mãn một số điều kiện:
Không thể thiết định ràng buộc cho PRIMARY KEY và UNIQUE .
Khi thiết định ràng buộc DEFAULT , không thể chỉ định CURRENT_TIME/CURRENT_DATE/CURRENT_TIMESTAMP .
Khi thiết định ràng buộc NOT NULL, giá trị mặc định ngoài NULL là bắt buộc.

Ví dụ:
Mã:
alter table mytable add column new_column;
Bây giờ tôi sẽ dùng lệnh để kiểm tra table của tôi có những gì.
Mã:
.schema myfriend
Bạn cần đăng nhập để thấy đính kèm

Bây giờ tôi sẽ thêm trường thông tin address vào table myfriend:
Mã:
alter table myfriend add column address text;
Bạn cần đăng nhập để thấy đính kèm


Tôi kiểm tra lại lần nữa:
Mã:
.schema myfriend
Bạn cần đăng nhập để thấy đính kèm
 
T

thanhphong

Guest
19. Xóa table:
Mã:
DROP TABLE TableName;
Ví dụ:
Mã:
drop table mytable;
Để giảm dung lượng, tôi chạy tiếp lệnh :
Mã:
vacuum;
 

vbano1

SMod
Thành viên BQT
20. Cách sử dụng từ khóa ràng buộc PRIMARY KEY
Ở đây tôi sẽ thuyết minh cách sử dụng từ khóa ràng buộc PRIMARY KEY.
Trong trường hợp ta thiết định một trường dữ liệu làm từ khóa chính (PRIMARY KEY), khi đó cột dữ liệu này sẽ hiển thị như là một khóa chính.
Đã gọi là khóa chính, tức nó phải là duy nhất để phục vụ tìm kiếm tra cứu, điều này cũng giống như mỗi người chỉ có một mã chứng minh nhân dân, thì một bản ghi (một dòng dữ liệu) trong đó có khóa chính, thì khóa chính này sẽ là duy nhất trong toàn bộ table đó.

Để chỉ định một trường dữ liệu làm khóa chính, ta có cú pháp:
Mã:
CREATE TABLE TableName(ColumnName PRIMARY KEY, ...);
Bạn cũng có thể chỉ định nhiều cột dữ liệu làm khóa chính đồng thời. Khi đó cú pháp như sau:
Mã:
CREATE TABLE TableName(ColumnName1, ColumnName2, ... ,
  PRIMARY KEY(ColumnName1, ColumnName2, ...));
Điề này cũng giống như bạn nối các ký tự s1&s2&s3 tạo thành keyword.
Trong trường dữ liệu khóa chính, bạn không thể nhập vào từ khóa giống nhau. Tuy nhiên SQLite thì có thể cho phép cất null vào nhiều trường dữ liệu.
Khi kết hợp dữ liệu từ nhiều cột để tạo thành khóa chính, nếu xảy ra từ khóa trùng nhau thì bạn sẽ không cất dữ liệu vào database được.

Nào, ta hãy thực hành:
Mã:
create table user(id int primary key, name text);
Bạn cần đăng nhập để thấy đính kèm


Bây giờ tôi sẽ cố tình nạp giá trị id trùng nhau như sau:
Mã:
insert into user values(1, 'Yamada');
insert into user values(2, 'Tanaka');
insert into user values(1, 'Honda');
Có lỗi xảy ra:
Bạn cần đăng nhập để thấy đính kèm
 
T

thanhphong

Guest
21. Mối quan hệ giữa ROWID và INTEGER PRIMARY KEY
Khi chúng ta thêm dữ liệu vào Sqlite, mỗi bản ghi (dòng dữ liệu) sẽ tự động được gán một chỉ số gọi là ROWID giống như là thông tin này được lưu ở một trường (cột) thông tin khác.
Ở bài viết này tôi sẽ giải thích mối liên quan giữa INTEGER PRIMARY KEY và ROWID
Để thực hành:
Sau đây tôi sẽ tạo ra bảng dữ liệu:
Mã:
create table user2 (id integer, name text);
Nạp dữ liệu vào table:
Mã:
insert into user2 values(3, 'Yamada');
insert into user2 values(8, 'Suzuki');
Nào, để tra thông tin Rowid ta làm như sau:
Mã:
select *, rowid from user2;
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

Tôi tiếp tục nạp dữ liệu:
Mã:
insert into user2 values(5, 'tuhocvba.net');
Tiếp tục tra cứu kết quả được như sau:
Bạn cần đăng nhập để thấy đính kèm


Bạn có thể sử dụng ROWID vào câu lệnh điều kiện WHERE :
Mã:
select *, rowid from user2 where rowid = 2;
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

(Bài dài quá, mình ngắt ở đây, lúc nào rảnh sẽ tiếp tục)
 

giaiphapvba

Administrator
Thành viên BQT
Mình dịch tiếp cho @thanhphong nhé. Đoạn này tiếng nhật hơi khó.
Lưu ý ROWID sử dụng OID làm bí danh để tương thích với các cơ sở dữ liệu khác.
Điều đó có nghĩa là bạn có thể sử dụng tên tùy ý miễn là có từ khóa OID đều được hiểu đây là ROWID.
Ví dụ:
Mã:
select *, rowid, oid, _rowid_ from user2;
Bạn cần đăng nhập để thấy đính kèm


Thiết định giá trị cho ROWID
Giá trị ROWID thường được thiết định tự động, chúng ta không cần lưu tâm vấn đề này, tuy nhiên bạn cũng cần biết, chúng ta có thể thiết định giá trị tùy ý cho nó.
Bây giờ tôi sẽ thực hiện điều đó:
Mã:
insert into user2(id, name, ROWID) values(10, 'Hanayama', 8);
Thực hiện tra cứu để kiểm chứng:
Mã:
select *, rowid from user2;
Kết quả:
Bạn cần đăng nhập để thấy đính kèm

Tuy nhiên chúng ta không thể có ROWID trùng nhau trên cùng một table. Để kiểm chứng điều này , tôi sẽ cố tình tạo ra ROWID = 3, chắc chắn sẽ có lỗi vì giá trị ROWID = 3 đã có rồi.
Mã:
insert into user2(id, name, ROWID) values(9, 'Uchida', 3);
Ra thông báo lỗi:
Error: UNIQUE constraint failed: user2.rowid
(Dài quá nên tạm dừng ở đây thôi).
 
Top