Kiranontimitta commited on
Commit
e61bc7d
·
verified ·
1 Parent(s): a8627c5

Create sqlite-sakila-schema.sql

Browse files
Files changed (1) hide show
  1. sqlite-sakila-schema.sql +645 -0
sqlite-sakila-schema.sql ADDED
@@ -0,0 +1,645 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+
3
+ Sakila for SQLite is a port of the Sakila example database available for MySQL, which was originally developed by Mike Hillyer of the MySQL AB documentation team.
4
+ This project is designed to help database administrators to decide which database to use for development of new products
5
+ The user can run the same SQL against different kind of databases and compare the performance
6
+
7
+ License: BSD
8
+ Copyright DB Software Laboratory
9
+ http://www.etl-tools.com
10
+
11
+ */
12
+
13
+ --
14
+ -- Table structure for table actor
15
+ --
16
+ --DROP TABLE actor;
17
+
18
+ CREATE TABLE actor (
19
+ actor_id INTEGER NOT NULL ,
20
+ first_name VARCHAR(45) NOT NULL,
21
+ last_name VARCHAR(45) NOT NULL,
22
+ last_update TIMESTAMP NOT NULL,
23
+ PRIMARY KEY (actor_id)
24
+ )
25
+ ;
26
+
27
+ CREATE INDEX idx_actor_last_name ON actor(last_name)
28
+ ;
29
+
30
+ CREATE TRIGGER actor_trigger_ai AFTER INSERT ON actor
31
+ BEGIN
32
+ UPDATE actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
33
+ END
34
+ ;
35
+
36
+ CREATE TRIGGER actor_trigger_au AFTER UPDATE ON actor
37
+ BEGIN
38
+ UPDATE actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
39
+ END
40
+ ;
41
+
42
+ --
43
+ -- Table structure for table country
44
+ --
45
+
46
+ CREATE TABLE country (
47
+ country_id INTEGER NOT NULL,
48
+ country VARCHAR(50) NOT NULL,
49
+ last_update TIMESTAMP,
50
+ PRIMARY KEY (country_id)
51
+ )
52
+ ;
53
+
54
+ CREATE TRIGGER country_trigger_ai AFTER INSERT ON country
55
+ BEGIN
56
+ UPDATE country SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
57
+ END
58
+ ;
59
+
60
+ CREATE TRIGGER country_trigger_au AFTER UPDATE ON country
61
+ BEGIN
62
+ UPDATE country SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
63
+ END
64
+ ;
65
+
66
+ --
67
+ -- Table structure for table city
68
+ --
69
+
70
+ CREATE TABLE city (
71
+ city_id INTEGER NOT NULL,
72
+ city VARCHAR(50) NOT NULL,
73
+ country_id INT NOT NULL,
74
+ last_update TIMESTAMP NOT NULL,
75
+ PRIMARY KEY (city_id),
76
+ CONSTRAINT fk_city_country FOREIGN KEY (country_id) REFERENCES country (country_id) ON DELETE NO ACTION ON UPDATE CASCADE
77
+ )
78
+ ;
79
+ CREATE INDEX idx_fk_country_id ON city(country_id)
80
+ ;
81
+
82
+ CREATE TRIGGER city_trigger_ai AFTER INSERT ON city
83
+ BEGIN
84
+ UPDATE city SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
85
+ END
86
+ ;
87
+
88
+ CREATE TRIGGER city_trigger_au AFTER UPDATE ON city
89
+ BEGIN
90
+ UPDATE city SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
91
+ END
92
+ ;
93
+
94
+ --
95
+ -- Table structure for table address
96
+ --
97
+
98
+ CREATE TABLE address (
99
+ address_id INTEGER NOT NULL,
100
+ address VARCHAR(50) NOT NULL,
101
+ address2 VARCHAR(50) DEFAULT NULL,
102
+ district VARCHAR(20) NOT NULL,
103
+ city_id INT NOT NULL,
104
+ postal_code VARCHAR(10) DEFAULT NULL,
105
+ phone VARCHAR(20) NOT NULL,
106
+ last_update TIMESTAMP NOT NULL,
107
+ PRIMARY KEY (address_id),
108
+ CONSTRAINT fk_address_city FOREIGN KEY (city_id) REFERENCES city (city_id) ON DELETE NO ACTION ON UPDATE CASCADE
109
+ )
110
+ ;
111
+
112
+ CREATE INDEX idx_fk_city_id ON address(city_id)
113
+ ;
114
+
115
+ CREATE TRIGGER address_trigger_ai AFTER INSERT ON address
116
+ BEGIN
117
+ UPDATE address SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
118
+ END
119
+ ;
120
+
121
+ CREATE TRIGGER address_trigger_au AFTER UPDATE ON address
122
+ BEGIN
123
+ UPDATE address SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
124
+ END
125
+ ;
126
+
127
+ --
128
+ -- Table structure for table language
129
+ --
130
+
131
+ CREATE TABLE language (
132
+ language_id INTEGER NOT NULL ,
133
+ name CHAR(20) NOT NULL,
134
+ last_update TIMESTAMP NOT NULL,
135
+ PRIMARY KEY (language_id)
136
+ )
137
+ ;
138
+
139
+ CREATE TRIGGER language_trigger_ai AFTER INSERT ON language
140
+ BEGIN
141
+ UPDATE language SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
142
+ END
143
+ ;
144
+
145
+ CREATE TRIGGER language_trigger_au AFTER UPDATE ON language
146
+ BEGIN
147
+ UPDATE language SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
148
+ END
149
+ ;
150
+
151
+ --
152
+ -- Table structure for table category
153
+ --
154
+
155
+ CREATE TABLE category (
156
+ category_id INTEGER NOT NULL,
157
+ name VARCHAR(25) NOT NULL,
158
+ last_update TIMESTAMP NOT NULL,
159
+ PRIMARY KEY (category_id)
160
+ );
161
+
162
+ CREATE TRIGGER category_trigger_ai AFTER INSERT ON category
163
+ BEGIN
164
+ UPDATE category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
165
+ END
166
+ ;
167
+
168
+ CREATE TRIGGER category_trigger_au AFTER UPDATE ON category
169
+ BEGIN
170
+ UPDATE category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
171
+ END
172
+ ;
173
+
174
+ --
175
+ -- Table structure for table customer
176
+ --
177
+
178
+ CREATE TABLE customer (
179
+ customer_id INTEGER NOT NULL,
180
+ store_id INT NOT NULL,
181
+ first_name VARCHAR(45) NOT NULL,
182
+ last_name VARCHAR(45) NOT NULL,
183
+ email VARCHAR(50) DEFAULT NULL,
184
+ address_id INT NOT NULL,
185
+ active CHAR(1) DEFAULT 'Y' NOT NULL,
186
+ create_date TIMESTAMP NOT NULL,
187
+ last_update TIMESTAMP NOT NULL,
188
+ PRIMARY KEY (customer_id),
189
+ CONSTRAINT fk_customer_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE NO ACTION ON UPDATE CASCADE,
190
+ CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE NO ACTION ON UPDATE CASCADE
191
+ )
192
+ ;
193
+
194
+ CREATE INDEX idx_customer_fk_store_id ON customer(store_id)
195
+ ;
196
+ CREATE INDEX idx_customer_fk_address_id ON customer(address_id)
197
+ ;
198
+ CREATE INDEX idx_customer_last_name ON customer(last_name)
199
+ ;
200
+
201
+ CREATE TRIGGER customer_trigger_ai AFTER INSERT ON customer
202
+ BEGIN
203
+ UPDATE customer SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
204
+ END
205
+ ;
206
+
207
+ CREATE TRIGGER customer_trigger_au AFTER UPDATE ON customer
208
+ BEGIN
209
+ UPDATE customer SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
210
+ END
211
+ ;
212
+
213
+ --
214
+ -- Table structure for table film
215
+ --
216
+
217
+ CREATE TABLE film (
218
+ film_id INTEGER NOT NULL,
219
+ title VARCHAR(255) NOT NULL,
220
+ description BLOB SUB_TYPE TEXT DEFAULT NULL,
221
+ release_year VARCHAR(4) DEFAULT NULL,
222
+ language_id INT NOT NULL,
223
+ original_language_id INT DEFAULT NULL,
224
+ rental_duration SMALLINT DEFAULT 3 NOT NULL,
225
+ rental_rate DECIMAL(4,2) DEFAULT 4.99 NOT NULL,
226
+ length SMALLINT DEFAULT NULL,
227
+ replacement_cost DECIMAL(5,2) DEFAULT 19.99 NOT NULL,
228
+ rating VARCHAR(10) DEFAULT 'G',
229
+ special_features VARCHAR(100) DEFAULT NULL,
230
+ last_update TIMESTAMP NOT NULL,
231
+ PRIMARY KEY (film_id),
232
+ CONSTRAINT CHECK_special_features CHECK(special_features is null or
233
+ special_features like '%Trailers%' or
234
+ special_features like '%Commentaries%' or
235
+ special_features like '%Deleted Scenes%' or
236
+ special_features like '%Behind the Scenes%'),
237
+ CONSTRAINT CHECK_special_rating CHECK(rating in ('G','PG','PG-13','R','NC-17')),
238
+ CONSTRAINT fk_film_language FOREIGN KEY (language_id) REFERENCES language (language_id) ,
239
+ CONSTRAINT fk_film_language_original FOREIGN KEY (original_language_id) REFERENCES language (language_id)
240
+ )
241
+ ;
242
+ CREATE INDEX idx_fk_language_id ON film(language_id)
243
+ ;
244
+ CREATE INDEX idx_fk_original_language_id ON film(original_language_id)
245
+ ;
246
+
247
+ CREATE TRIGGER film_trigger_ai AFTER INSERT ON film
248
+ BEGIN
249
+ UPDATE film SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
250
+ END
251
+ ;
252
+
253
+ CREATE TRIGGER film_trigger_au AFTER UPDATE ON film
254
+ BEGIN
255
+ UPDATE film SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
256
+ END
257
+ ;
258
+
259
+ --
260
+ -- Table structure for table film_actor
261
+ --
262
+
263
+ CREATE TABLE film_actor (
264
+ actor_id INT NOT NULL,
265
+ film_id INT NOT NULL,
266
+ last_update TIMESTAMP NOT NULL,
267
+ PRIMARY KEY (actor_id,film_id),
268
+ CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE NO ACTION ON UPDATE CASCADE,
269
+ CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE NO ACTION ON UPDATE CASCADE
270
+ )
271
+ ;
272
+
273
+ CREATE INDEX idx_fk_film_actor_film ON film_actor(film_id)
274
+ ;
275
+
276
+ CREATE INDEX idx_fk_film_actor_actor ON film_actor(actor_id)
277
+ ;
278
+
279
+ CREATE TRIGGER film_actor_trigger_ai AFTER INSERT ON film_actor
280
+ BEGIN
281
+ UPDATE film_actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
282
+ END
283
+ ;
284
+
285
+ CREATE TRIGGER film_actor_trigger_au AFTER UPDATE ON film_actor
286
+ BEGIN
287
+ UPDATE film_actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
288
+ END
289
+ ;
290
+
291
+
292
+ --
293
+ -- Table structure for table film_category
294
+ --
295
+
296
+ CREATE TABLE film_category (
297
+ film_id INT NOT NULL,
298
+ category_id INT NOT NULL,
299
+ last_update TIMESTAMP NOT NULL,
300
+ PRIMARY KEY (film_id, category_id),
301
+ CONSTRAINT fk_film_category_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE NO ACTION ON UPDATE CASCADE,
302
+ CONSTRAINT fk_film_category_category FOREIGN KEY (category_id) REFERENCES category (category_id) ON DELETE NO ACTION ON UPDATE CASCADE
303
+ )
304
+ ;
305
+
306
+ CREATE INDEX idx_fk_film_category_film ON film_category(film_id)
307
+ ;
308
+
309
+ CREATE INDEX idx_fk_film_category_category ON film_category(category_id)
310
+ ;
311
+
312
+ CREATE TRIGGER film_category_trigger_ai AFTER INSERT ON film_category
313
+ BEGIN
314
+ UPDATE film_category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
315
+ END
316
+ ;
317
+
318
+ CREATE TRIGGER film_category_trigger_au AFTER UPDATE ON film_category
319
+ BEGIN
320
+ UPDATE film_category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
321
+ END
322
+ ;
323
+
324
+ --
325
+ -- Table structure for table film_text
326
+ --
327
+
328
+ CREATE TABLE film_text (
329
+ film_id INTEGER NOT NULL,
330
+ title VARCHAR(255) NOT NULL,
331
+ description BLOB SUB_TYPE TEXT,
332
+ PRIMARY KEY (film_id)
333
+ )
334
+ ;
335
+
336
+ --
337
+ -- Table structure for table inventory
338
+ --
339
+
340
+ CREATE TABLE inventory (
341
+ inventory_id INTEGER NOT NULL,
342
+ film_id INT NOT NULL,
343
+ store_id INT NOT NULL,
344
+ last_update TIMESTAMP NOT NULL,
345
+ PRIMARY KEY (inventory_id),
346
+ CONSTRAINT fk_inventory_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE NO ACTION ON UPDATE CASCADE,
347
+ CONSTRAINT fk_inventory_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE NO ACTION ON UPDATE CASCADE
348
+ )
349
+ ;
350
+
351
+ CREATE INDEX idx_fk_film_id ON inventory(film_id)
352
+ ;
353
+
354
+ CREATE INDEX idx_fk_film_id_store_id ON inventory(store_id,film_id)
355
+ ;
356
+
357
+ CREATE TRIGGER inventory_trigger_ai AFTER INSERT ON inventory
358
+ BEGIN
359
+ UPDATE inventory SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
360
+ END
361
+ ;
362
+
363
+ CREATE TRIGGER inventory_trigger_au AFTER UPDATE ON inventory
364
+ BEGIN
365
+ UPDATE inventory SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
366
+ END
367
+ ;
368
+
369
+ --
370
+ -- Table structure for table staff
371
+ --
372
+
373
+ CREATE TABLE staff (
374
+ staff_id INTEGER NOT NULL,
375
+ first_name VARCHAR(45) NOT NULL,
376
+ last_name VARCHAR(45) NOT NULL,
377
+ address_id INT NOT NULL,
378
+ picture BLOB DEFAULT NULL,
379
+ email VARCHAR(50) DEFAULT NULL,
380
+ store_id INT NOT NULL,
381
+ active SMALLINT DEFAULT 1 NOT NULL,
382
+ username VARCHAR(16) NOT NULL,
383
+ password VARCHAR(40) DEFAULT NULL,
384
+ last_update TIMESTAMP NOT NULL,
385
+ PRIMARY KEY (staff_id),
386
+ CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE NO ACTION ON UPDATE CASCADE,
387
+ CONSTRAINT fk_staff_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE NO ACTION ON UPDATE CASCADE
388
+ )
389
+ ;
390
+ CREATE INDEX idx_fk_staff_store_id ON staff(store_id)
391
+ ;
392
+
393
+ CREATE INDEX idx_fk_staff_address_id ON staff(address_id)
394
+ ;
395
+
396
+ CREATE TRIGGER staff_trigger_ai AFTER INSERT ON staff
397
+ BEGIN
398
+ UPDATE staff SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
399
+ END
400
+ ;
401
+
402
+ CREATE TRIGGER staff_trigger_au AFTER UPDATE ON staff
403
+ BEGIN
404
+ UPDATE staff SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
405
+ END
406
+ ;
407
+
408
+ --
409
+ -- Table structure for table store
410
+ --
411
+
412
+ CREATE TABLE store (
413
+ store_id INTEGER NOT NULL,
414
+ manager_staff_id INT NOT NULL,
415
+ address_id INT NOT NULL,
416
+ last_update TIMESTAMP NOT NULL,
417
+ PRIMARY KEY (store_id),
418
+ CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ,
419
+ CONSTRAINT fk_store_address FOREIGN KEY (address_id) REFERENCES address (address_id)
420
+ )
421
+ ;
422
+
423
+ CREATE INDEX idx_store_fk_manager_staff_id ON store(manager_staff_id)
424
+ ;
425
+
426
+ CREATE INDEX idx_fk_store_address ON store(address_id)
427
+ ;
428
+
429
+ CREATE TRIGGER store_trigger_ai AFTER INSERT ON store
430
+ BEGIN
431
+ UPDATE store SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
432
+ END
433
+ ;
434
+
435
+ CREATE TRIGGER store_trigger_au AFTER UPDATE ON store
436
+ BEGIN
437
+ UPDATE store SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
438
+ END
439
+ ;
440
+
441
+ --
442
+ -- Table structure for table payment
443
+ --
444
+
445
+ CREATE TABLE payment (
446
+ payment_id INTEGER NOT NULL,
447
+ customer_id INT NOT NULL,
448
+ staff_id INT NOT NULL,
449
+ rental_id INT DEFAULT NULL,
450
+ amount DECIMAL(5,2) NOT NULL,
451
+ payment_date TIMESTAMP NOT NULL,
452
+ last_update TIMESTAMP NOT NULL,
453
+ PRIMARY KEY (payment_id),
454
+ CONSTRAINT fk_payment_rental FOREIGN KEY (rental_id) REFERENCES rental (rental_id) ON DELETE SET NULL ON UPDATE CASCADE,
455
+ CONSTRAINT fk_payment_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ,
456
+ CONSTRAINT fk_payment_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id)
457
+ )
458
+ ;
459
+ CREATE INDEX idx_fk_staff_id ON payment(staff_id)
460
+ ;
461
+ CREATE INDEX idx_fk_customer_id ON payment(customer_id)
462
+ ;
463
+
464
+ CREATE TRIGGER payment_trigger_ai AFTER INSERT ON payment
465
+ BEGIN
466
+ UPDATE payment SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
467
+ END
468
+ ;
469
+
470
+ CREATE TRIGGER payment_trigger_au AFTER UPDATE ON payment
471
+ BEGIN
472
+ UPDATE payment SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
473
+ END
474
+ ;
475
+
476
+ CREATE TABLE rental (
477
+ rental_id INTEGER NOT NULL,
478
+ rental_date TIMESTAMP NOT NULL,
479
+ inventory_id INT NOT NULL,
480
+ customer_id INT NOT NULL,
481
+ return_date TIMESTAMP DEFAULT NULL,
482
+ staff_id INT NOT NULL,
483
+ last_update TIMESTAMP NOT NULL,
484
+ PRIMARY KEY (rental_id),
485
+ CONSTRAINT fk_rental_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ,
486
+ CONSTRAINT fk_rental_inventory FOREIGN KEY (inventory_id) REFERENCES inventory (inventory_id) ,
487
+ CONSTRAINT fk_rental_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id)
488
+ )
489
+ ;
490
+ CREATE INDEX idx_rental_fk_inventory_id ON rental(inventory_id)
491
+ ;
492
+ CREATE INDEX idx_rental_fk_customer_id ON rental(customer_id)
493
+ ;
494
+ CREATE INDEX idx_rental_fk_staff_id ON rental(staff_id)
495
+ ;
496
+ CREATE UNIQUE INDEX idx_rental_uq ON rental (rental_date,inventory_id,customer_id)
497
+ ;
498
+
499
+ CREATE TRIGGER rental_trigger_ai AFTER INSERT ON rental
500
+ BEGIN
501
+ UPDATE rental SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
502
+ END
503
+ ;
504
+
505
+ CREATE TRIGGER rental_trigger_au AFTER UPDATE ON rental
506
+ BEGIN
507
+ UPDATE rental SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
508
+ END
509
+ ;
510
+ --
511
+ -- View structure for view customer_list
512
+ --
513
+
514
+ CREATE VIEW customer_list
515
+ AS
516
+ SELECT cu.customer_id AS ID,
517
+ cu.first_name||' '||cu.last_name AS name,
518
+ a.address AS address,
519
+ a.postal_code AS zip_code,
520
+ a.phone AS phone,
521
+ city.city AS city,
522
+ country.country AS country,
523
+ case when cu.active=1 then 'active' else '' end AS notes,
524
+ cu.store_id AS SID
525
+ FROM customer AS cu JOIN address AS a ON cu.address_id = a.address_id JOIN city ON a.city_id = city.city_id
526
+ JOIN country ON city.country_id = country.country_id
527
+ ;
528
+ --
529
+ -- View structure for view film_list
530
+ --
531
+
532
+ CREATE VIEW film_list
533
+ AS
534
+ SELECT film.film_id AS FID,
535
+ film.title AS title,
536
+ film.description AS description,
537
+ category.name AS category,
538
+ film.rental_rate AS price,
539
+ film.length AS length,
540
+ film.rating AS rating,
541
+ actor.first_name||' '||actor.last_name AS actors
542
+ FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id
543
+ JOIN film_actor ON film.film_id = film_actor.film_id
544
+ JOIN actor ON film_actor.actor_id = actor.actor_id
545
+ ;
546
+
547
+ --
548
+ -- View structure for view staff_list
549
+ --
550
+
551
+ CREATE VIEW staff_list
552
+ AS
553
+ SELECT s.staff_id AS ID,
554
+ s.first_name||' '||s.last_name AS name,
555
+ a.address AS address,
556
+ a.postal_code AS zip_code,
557
+ a.phone AS phone,
558
+ city.city AS city,
559
+ country.country AS country,
560
+ s.store_id AS SID
561
+ FROM staff AS s JOIN address AS a ON s.address_id = a.address_id JOIN city ON a.city_id = city.city_id
562
+ JOIN country ON city.country_id = country.country_id
563
+ ;
564
+ --
565
+ -- View structure for view sales_by_store
566
+ --
567
+
568
+ CREATE VIEW sales_by_store
569
+ AS
570
+ SELECT
571
+ s.store_id
572
+ ,c.city||','||cy.country AS store
573
+ ,m.first_name||' '||m.last_name AS manager
574
+ ,SUM(p.amount) AS total_sales
575
+ FROM payment AS p
576
+ INNER JOIN rental AS r ON p.rental_id = r.rental_id
577
+ INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id
578
+ INNER JOIN store AS s ON i.store_id = s.store_id
579
+ INNER JOIN address AS a ON s.address_id = a.address_id
580
+ INNER JOIN city AS c ON a.city_id = c.city_id
581
+ INNER JOIN country AS cy ON c.country_id = cy.country_id
582
+ INNER JOIN staff AS m ON s.manager_staff_id = m.staff_id
583
+ GROUP BY
584
+ s.store_id
585
+ , c.city||','||cy.country
586
+ , m.first_name||' '||m.last_name
587
+ ;
588
+ --
589
+ -- View structure for view sales_by_film_category
590
+ --
591
+ -- Note that total sales will add up to >100% because
592
+ -- some titles belong to more than 1 category
593
+ --
594
+
595
+ CREATE VIEW sales_by_film_category
596
+ AS
597
+ SELECT
598
+ c.name AS category
599
+ , SUM(p.amount) AS total_sales
600
+ FROM payment AS p
601
+ INNER JOIN rental AS r ON p.rental_id = r.rental_id
602
+ INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id
603
+ INNER JOIN film AS f ON i.film_id = f.film_id
604
+ INNER JOIN film_category AS fc ON f.film_id = fc.film_id
605
+ INNER JOIN category AS c ON fc.category_id = c.category_id
606
+ GROUP BY c.name
607
+ ;
608
+
609
+ --
610
+ -- View structure for view actor_info
611
+ --
612
+
613
+ /*
614
+ CREATE VIEW actor_info
615
+ AS
616
+ SELECT
617
+ a.actor_id,
618
+ a.first_name,
619
+ a.last_name,
620
+ GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ',
621
+ (SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ')
622
+ FROM sakila.film f
623
+ INNER JOIN sakila.film_category fc
624
+ ON f.film_id = fc.film_id
625
+ INNER JOIN sakila.film_actor fa
626
+ ON f.film_id = fa.film_id
627
+ WHERE fc.category_id = c.category_id
628
+ AND fa.actor_id = a.actor_id
629
+ )
630
+ )
631
+ ORDER BY c.name SEPARATOR '; ')
632
+ AS film_info
633
+ FROM sakila.actor a
634
+ LEFT JOIN sakila.film_actor fa
635
+ ON a.actor_id = fa.actor_id
636
+ LEFT JOIN sakila.film_category fc
637
+ ON fa.film_id = fc.film_id
638
+ LEFT JOIN sakila.category c
639
+ ON fc.category_id = c.category_id
640
+ GROUP BY a.actor_id, a.first_name, a.last_name;
641
+ */
642
+
643
+ -- TO DO PROCEDURES
644
+ -- TO DO TRIGGERS
645
+