Làm thế nào để bạn đặt một giá trị mặc định cho cột Thời gian của MySQL?


898

Làm thế nào để bạn đặt một giá trị mặc định cho cột Thời gian của MySQL?

Trong SQL Server, nó getdate(). Tương đương với MySQL là gì? Tôi đang sử dụng MySQL 5.x nếu đó là một yếu tố.


4
Tôi sử dụng CURRENT_TIMESTAMP trong bảng mysql của mình (không phải trong truy vấn), có lẽ điều này cũng có thể hữu ích.
Ruben

15
Tính năng này hiện đã được thêm vào MySQL 5.6.5. Hy vọng điều này sẽ giúp được ai đó. tối ưu hóa
this.blogspot.co.uk / 2012/04 / từ

@GhostInTheSecureShell hoàn toàn có nhiệm vụ cài đặt nó, ít nhất là trên Debian, nhưng chắc chắn là một tính năng tuyệt vời. Tôi nghĩ cuối cùng tất cả những câu hỏi "hai CURRENT_TIMESTAMP" này sẽ được giảm bớt!
Marc DiMillo

đó là hàm now () nếu không bạn có thể thực hiện với các cài đặt mặc định ở cấp cột.
Anshul Sharma

Câu trả lời:


862

EDIT QUAN TRỌNG: Hiện tại có thể đạt được điều này với các trường DATETIME kể từ MySQL 5.6.5 , hãy xem bài đăng khác bên dưới ...

Các phiên bản trước không thể làm điều đó với DATETIME ...

Nhưng bạn có thể làm điều đó với TIMESTAMP:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

** CAVEAT: NẾU bạn xác định một cột với CURRENT_TIMESTAMP BẬT làm mặc định, bạn sẽ cần LUÔN xác định một giá trị cho cột này hoặc giá trị sẽ tự động đặt lại thành "now ()" khi cập nhật. Điều này có nghĩa là nếu bạn không muốn giá trị thay đổi, câu lệnh CẬP NHẬT của bạn phải chứa "[tên cột của bạn] = [tên cột của bạn]" (hoặc một số giá trị khác) hoặc giá trị sẽ trở thành "now ()". Lạ, nhưng đúng. Tôi hi vọng cái này giúp được. Tôi đang sử dụng 5.5.56-MariaDB **


400
Điều quan trọng cần lưu ý là datetime có phạm vi 1000-9999, nhưng phạm vi cho dấu thời gian chỉ là 1970-2038 . đây có thể là một vấn đề nếu hệ thống của bạn phải lưu trữ ngày sinh hoặc bạn phải xử lý một số thứ như kế hoạch thanh toán cho khoản thế chấp 30 năm. dev.mysql.com/doc/refman/5.0/en/datetime.html
Kip

13
Hãy cẩn thận với dấu thời gian vì nó tự động cập nhật một cách kỳ diệu ... xem câu trả lời tiếp theo stackoverflow.com/a/1483959/233906
Cerber

6
có thể từ phiên bản 5.6.5, xem câu trả lời của Gustav bên dưới (Tôi nhận ra câu trả lời của bạn đã được đăng khi MySQL vẫn là 5.0!)
e2-e4

4
@Kip, Xin chào, có thể có một giá trị mặc định cho một DATEcột không? (không phải là một datetimecột).
Sajib Acharya

ti dường như không thể thực hiện được cho các cột DATE: bạn phải sử dụng kiểu dữ liệu DATETIME
Fabio Napodano

599

Trong phiên bản 5.6.5, có thể đặt giá trị mặc định trên cột datetime và thậm chí tạo một cột sẽ cập nhật khi hàng được cập nhật. Định nghĩa loại:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Tham khảo: http://optizes-this.blogspot.com/2012/04/datetime-default-now-finally-av Available.html


3
Giá trị mặc định không hợp lệ cho 'menu_creation_time'
Fernando Trindade

2
@FernandoTrindade Bạn cần phiên bản MySQL 5.6.5 trở lên. Bạn có thể thấy nó hoạt động ở đây: sqlfiddle.com/#!9/dd2be
Gustav Bertram

1
@GustavBertram, tôi đang sử dụng phiên bản 5.6.22, nhưng tôi vẫn gặp lỗi như sau: CREATE TABLE tbl (ChènDate DATETIME KHÔNG NULL DEFAULT CURRENT_TIMESTAMP, UpdateDate TIMESTAMP NULL TRÊN CẬP NHẬT HIỆN TẠI Mã lỗi: 1294. Mệnh đề CẬP NHẬT không hợp lệ cho cột 'UpdateDate'
Manish Sapkal

@M BiếnSapkal Bạn đang sử dụng TIMESTAMP, không phải là dữ liệu. Ngoài ra, đừng biến nó thành NULL.
Gustav Bertram

1
Tôi nghĩ cú pháp "TRÊN CẬP NHẬT" là sai. Theo dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html nên làdt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Dan Bough

148

MySQL ( trước phiên bản 5.6.5 ) không cho phép các chức năng được sử dụng cho các giá trị DateTime mặc định. TIMESTAMP không phù hợp do hành vi kỳ quặc của nó và không được khuyến nghị sử dụng làm dữ liệu đầu vào. (Xem Mặc định loại dữ liệu MySQL .)

Điều đó nói rằng, bạn có thể thực hiện điều này bằng cách tạo Kích hoạt .

Tôi có một bảng với trường DateCreated thuộc loại DateTime. Tôi đã tạo một kích hoạt trên bảng đó "Trước khi chèn" và " SET NEW.DateCreated=NOW()" và nó hoạt động rất tốt.

Tôi hi vọng nó sẽ giúp ích cho mọi người.


21
TẠO TRIGGER trigger_foo_SetCreatedAt TRƯỚC KHI CHỌN TRÊN foo CHO MACHI ROW SET NEW.created_at = UTC_TIMESTAMP ();
kgriffs

5
Có lẽ bạn nên sử dụng dấu thời gian tốt hơn là kích hoạt sự tỉnh táo trong tương lai (bảo trì). Đây là một trường hợp sử dụng quá nhỏ cho một kích hoạt, mặc dù nó là một giải pháp.
getWeberForStackExchange

8
Bạn có thể sẽ chỉ muốn đặt giá trị mặc địnhIF NEW.created_at IS NOT NULL
Petr Peller

132

Đối với tôi, cách tiếp cận kích hoạt đã làm việc tốt nhất, nhưng tôi đã tìm thấy một nhược điểm với cách tiếp cận này. Xem xét trình kích hoạt cơ bản để đặt trường ngày thành thời gian hiện tại khi chèn:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

Điều này thường rất hay, nhưng giả sử bạn muốn đặt trường theo cách thủ công thông qua câu lệnh INSERT, như vậy:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

Điều gì xảy ra là trình kích hoạt ngay lập tức ghi đè giá trị được cung cấp của bạn cho trường và vì vậy cách duy nhất để đặt thời gian không hiện tại là câu lệnh CẬP NHẬT tiếp theo - yuck! Để ghi đè hành vi này khi giá trị được cung cấp, hãy thử trình kích hoạt được sửa đổi một chút này với toán tử IFNULL:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

Điều này mang lại điều tốt nhất cho cả hai thế giới: bạn có thể cung cấp một giá trị cho cột ngày của bạn và nó sẽ mất, và nếu không, nó sẽ mặc định theo thời gian hiện tại. Nó vẫn còn ghetto liên quan đến một cái gì đó sạch như DEFAULT GETDATE () trong định nghĩa bảng, nhưng chúng ta đang tiến gần hơn!


5
+1 để thừa nhận cảnh báo bằng cách ghi đè các giá trị người dùng rõ ràng khi chèn.
Kip

2
Cá nhân tôi nghĩ rằng đây là cách tốt nhất để đi. TIMESTAMP thực sự có hành vi kỳ quặc và tôi sẽ không bao giờ viết mã có giới hạn 2038 năm.
Eric

Không sao đâu, tôi đã đoán ra. Quên đặt trường cho phép NULL. Không có cảnh báo nữa.
Kaji

Kích hoạt là xấu xa! Chỉ sử dụng chúng khi không có cách nào khác để làm gì đó. Tốt hơn là nâng cấp lên id 5.6.x bạn có thể sử dụng kích hoạt.
ksymeon

4
Trong MySQL 5.5, IFNULL không hoạt động trên DATETIME; sử dụng kích hoạt ở trên, dateAddedsẽ hiển thị tất cả '0000-00-00 00:00:00'. Sử dụng điều này thực hiện mẹo: `CHO MACHI ROW NẾU NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); HẾT NẾU; `
Kenney

28

Tôi đã có thể giải quyết điều này bằng cách sử dụng câu lệnh thay đổi này trên bảng có hai trường datetime.

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Điều này hoạt động như bạn mong đợi hàm now () hoạt động. Chèn null hoặc bỏ qua các trường created_dt và update_dt dẫn đến một giá trị dấu thời gian hoàn hảo trong cả hai trường. Bất kỳ cập nhật nào cho hàng đều thay đổi update_dt. Nếu bạn chèn các bản ghi thông qua trình duyệt truy vấn MySQL, bạn cần thêm một bước nữa, một trình kích hoạt để xử lý created_dt với dấu thời gian mới.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

Trình kích hoạt có thể là bất cứ điều gì bạn muốn Tôi giống như quy ước đặt tên [trig] _ [my_table_name] _ [insert]


Tôi muốn nói, nếu bạn chèn các bản ghi thông qua trình duyệt truy vấn MySQL theo cách thủ công thông qua lưới mà không có câu lệnh insert () thì kích hoạt là cần thiết. Nếu bạn luôn sử dụng một câu lệnh chèn, kích hoạt là hoàn toàn không cần thiết.

Rất tiếc! Ý tôi là Trình kích hoạt (tên) có thể là bất cứ điều gì bạn muốn vì tên kích hoạt hoàn toàn không ảnh hưởng đến chức năng. Hầu hết mọi người sẽ biết điều đó, nhưng một số người mới biết về MySQL có thể không biết ...

Rất tiếc, xin lỗi về việc thiếu dòng ngắt. Sử dụng dấu chấm phẩy để đánh dấu kết thúc của mỗi dòng.

24

Bạn có thể sử dụng kích hoạt để làm loại công cụ này.

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END;

18

Đối với tất cả những người mất lòng khi cố gắng đặt giá trị DATETIME mặc định trong MySQL , tôi biết chính xác cảm giác / cảm nhận của bạn. Vì vậy, đây là:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Quan sát cẩn thận rằng tôi chưa thêm dấu ngoặc đơn / dấu ngoặc kép quanh 0

Tôi thực sự nhảy sau khi giải quyết điều này: D


8
Nó không chèn vào thời điểm hiện tại. Nó sẽ chèn '0000-00-00 00:00:00'.
Hố đào

8
Tôi không nói nó đặt thời gian hiện tại. Nhiều ppl đã / đang cố gắng đặt giá trị 0 mặc định, nhưng nó không hoạt động. Chúng ta cần loại bỏ các trích dẫn. Vì phát hiện này gây ra rất nhiều thời gian và thất vọng, tôi đã nghĩ đến việc chia sẻ nó với cộng đồng. Những người như bạn chịu trách nhiệm cho người dùng mất hứng thú chia sẻ thông tin hữu ích với người khác. Tôi thực sự không thấy bất kỳ lý do nào để có được -1! Bất cứ điều gì.
Augiwan

3
Điều tương tự có thể đạt được với DATETIME KHÔNG NULL.
Brendan Byrd

Có thêm một ký tự `bên trong lệnh sql mẫu, mà tôi không thể chỉnh sửa, vì nó chỉ chỉnh sửa một ký tự.
quapka

mã của bạn không hoạt động với tôi, đây là những gì đã hoạt độngALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
Smith


14

Nếu bạn đã tạo bảng rồi thì bạn có thể sử dụng

Để thay đổi giá trị mặc định thành thời gian ngày hiện tại

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Để thay đổi giá trị mặc định thành '2015-05-11 13:01:01'

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';


9

Tôi đang chạy MySql Server 5.7.11 và câu này:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

không làm việc. Nhưng như sau:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

chỉ hoạt động .

Là một sidenote , nó được đề cập trong các tài liệu mysql :

Loại DATE được sử dụng cho các giá trị có phần ngày nhưng không có phần thời gian. MySQL truy xuất và hiển thị các giá trị DATE theo định dạng 'YYYY-MM-DD'. Phạm vi được hỗ trợ là '1000-01-01' đến '9999-12-31'.

ngay cả khi họ cũng nói:

Các giá trị DATE, DATETIME hoặc TIMESTAMP không hợp lệ được chuyển đổi thành giá trị zero 0 của loại thích hợp ('0000-00-00' hoặc '0000-00-00 00:00:00').


8

Bạn có thể sử dụng now () để đặt giá trị của cột datetime, nhưng hãy nhớ rằng bạn không thể sử dụng giá trị đó làm giá trị mặc định.


4
thật. Tôi vừa thử sử dụng và nhận được lỗi "Mã lỗi: 1067. Giá trị mặc định không hợp lệ." vậy câu trả lời là gì? ;-)
Brian Boatright

Đây là giải pháp tốt nhất để thỏa hiệp các phiên bản MySQL 5.5 và 5.6. Đối với phiên bản 5.5, xác định trước giá trị của NOW()và sử dụng nó sau để chèn. Đối với phiên bản 5.6, chỉ cần đặt NOW()làm giá trị mặc định.
Abel Callejo

8

Đối với tất cả những người sử dụng cột TIMESTAMP như một giải pháp tôi muốn thứ hai giới hạn sau từ hướng dẫn:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

"Kiểu dữ liệu TIMESTAMP có phạm vi từ '1970-01-01 00:00:01' UTC đến ' 2038-01-19 03:14:07 ' UTC. Nó có các thuộc tính khác nhau, tùy thuộc vào phiên bản MySQL và SQL chế độ máy chủ đang chạy. Các thuộc tính này được mô tả sau trong phần này. "

Vì vậy, điều này rõ ràng sẽ phá vỡ phần mềm của bạn trong khoảng 28 năm.

Tôi tin rằng giải pháp duy nhất về phía cơ sở dữ liệu là sử dụng các kích hoạt như được đề cập trong các câu trả lời khác.


2
Điều gì sẽ xảy ra nếu MySQL được cập nhật 20 năm kể từ bây giờ và giới hạn đó đã được gỡ bỏ? Tôi không chắc nếu điều đó có thể nhưng chỉ là một suy nghĩ.
NessDan

7

Trong khi xác định các kích hoạt đa dòng, người ta phải thay đổi dấu phân cách vì dấu chấm phẩy sẽ được trình biên dịch MySQL lấy làm kết thúc kích hoạt và tạo ra lỗi. ví dụ

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;

5

Đây là cách thực hiện trên MySQL 5.1:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Tôi không biết tại sao bạn phải nhập tên cột hai lần.


5
THAY ĐỔI cũng là để đổi tên lĩnh vực. Tên cột đầu tiên là 'cũ', tên cột thứ hai là 'mới'. Nó có vẻ dư thừa nếu bạn không thay đổi tên của trường. Nếu nó quá khó chịu về mặt thẩm mỹ, hãy thử MODIFY.
John Gordon

5

Mặc dù bạn không thể làm điều này với DATETIMEđịnh nghĩa mặc định, bạn chỉ cần kết hợp một câu lệnh chọn trong câu lệnh chèn như thế này:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Lưu ý thiếu dấu ngoặc kép quanh bàn.

Dành cho MySQL 5.5


3

Nếu bạn đang cố gắng đặt giá trị mặc định là NOW (), tôi không nghĩ MySQL hỗ trợ điều đó. Trong MySQL, bạn không thể sử dụng hàm hoặc biểu thức làm giá trị mặc định cho bất kỳ loại cột nào, ngoại trừ cột loại dữ liệu TIMESTAMP, mà bạn có thể chỉ định CURRENT_TIMESTAMP làm mặc định.


3

Tôi nghĩ nó đơn giản trong mysql vì mysql hàm inbuilt được gọi là now () cung cấp thời gian hiện tại (thời gian của lần chèn đó).

Vì vậy, truy vấn của bạn sẽ trông giống như

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

Cảm ơn bạn.


2
CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

Trong truy vấn trên để tạo 'testtable', tôi đã sử dụng '1999-12-12 12:12:12' làm giá trị mặc định cho cột DATETIME colname


1

Sử dụng mã sau

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;

0

Nếu bạn đang cố gắng đặt giá trị mặc định là NOW (), MySQL hỗ trợ rằng bạn phải thay đổi loại cột TIMESTAMP thay vì DATETIME. TIMESTAMP có ngày và giờ hiện tại là mặc định..tôi nghĩ rằng nó sẽ giải quyết vấn đề của bạn ..


0

Ví dụ: Nếu tôi có một bảng có tên là 'trang web' với cột created_at và cột update_at vừa là DATETIME và cần giá trị mặc định bây giờ, tôi có thể thực hiện sql sau để đạt được điều này.

ALTER TABLE `site` THAY ĐỔI` created_at`` created_at` TIMESTAMP KHÔNG NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` THAY ĐỔI` created_at`` created_at` DATETIME NULL DEFAULT NULL;

ALTER TABLE `site` THAY ĐỔI` update_at`` update_at` TIMESTAMP KHÔNG NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` THAY ĐỔI` update_at`` update_at` DATETIME NULL DEFAULT NULL;

Trình tự các câu lệnh rất quan trọng vì một bảng không thể có hai cột kiểu TIMESTAMP với các giá trị mặc định là CUREENT TIMESTAMP


0

Đây là ví dụ kích hoạt của tôi:

/************ ROLE ************/
drop table if exists `role`;
create table `role` (
    `id_role` bigint(20) unsigned not null auto_increment,
    `date_created` datetime,
    `date_deleted` datetime,
    `name` varchar(35) not null,
    `description` text,
    primary key (`id_role`)
) comment='';

drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
    on `role`
    for each row 
    set new.`date_created` = now();


0

Hoạt động tốt với MySQL 8.x

CREATE TABLE `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
      `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      UNIQUE KEY `mobile_UNIQUE` (`mobile`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-3

Bạn có thể giải quyết dấu thời gian mặc định. Trước tiên hãy xem xét bộ ký tự nào bạn đang sử dụng, ví dụ nếu bạn lấy utf8, bộ ký tự này hỗ trợ tất cả các ngôn ngữ và nếu bạn lấy laten1 thì bộ ký tự này chỉ hỗ trợ cho tiếng Anh. Setp tiếp theo nếu bạn đang làm việc theo bất kỳ dự án nào, bạn nên biết múi giờ của khách hàng và chọn bạn là vùng khách hàng. Bước này là bắt buộc.


2
Cột DateTime không thể có giá trị mặc định. Đó là tài liệu 'tính năng'. Không phải tất cả các nhà phát triển có quyền truy cập để thay đổi mã hóa ký tự của họ. Và việc đặt máy chủ thành múi giờ của máy khách thường không phải là một khả năng, đặc biệt là khi các máy khách không hoàn toàn có nguồn gốc ở một vùng múi giờ duy nhất.
rlb.usa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.