[{"data":1,"prerenderedAt":2814},["ShallowReactive",2],{"post:\u002Fposts\u002Fmysql\u002Fmysql-learning-06":3,"posts:ordered":2529},{"id":4,"title":5,"body":6,"category":2514,"cover":2515,"date":1784,"description":2516,"extension":2517,"featured":2518,"meta":2519,"navigation":403,"path":2520,"seo":2521,"series":2522,"seriesOrder":202,"stem":2523,"tags":2524,"__hash__":2528},"posts\u002Fposts\u002Fmysql\u002Fmysql-learning-06.md","MySQL 学习笔记 06：CREATE TABLE 与数据类型",{"type":7,"value":8,"toc":2498},"minimark",[9,16,21,26,38,65,79,82,86,91,234,237,303,306,326,329,337,340,534,536,540,552,554,575,578,631,633,641,643,647,650,652,762,764,778,781,806,808,816,818,822,826,832,848,851,963,970,1044,1047,1131,1133,1297,1300,1306,1308,1335,1337,1341,1347,1349,1414,1417,1455,1458,1607,1609,1632,1634,1700,1702,1706,1712,1714,1773,1775,1799,1801,1836,1838,1855,1857,1861,1918,1920,1933,1935,2060,2063,2097,2099,2110,2112,2116,2197,2199,2243,2245,2251,2269,2272,2300,2303,2335,2338,2413,2415,2423,2426,2449,2451,2462,2464,2468,2474,2477,2494],[10,11,12],"blockquote",{},[13,14,15],"p",{},"本文是《SQL 学习笔记》系列的一篇：示例数据和 SQL 都是我整理并在 MySQL 8 上跑过的，讲解部分按自己的理解写的。",[17,18,20],"h1",{"id":19},"_9-create-table-与数据类型","9 CREATE TABLE 与数据类型",[22,23,25],"h2",{"id":24},"_90-示例约定","9.0 示例约定",[13,27,28,29,33,34,37],{},"假设我们有一个数据库 ",[30,31,32],"code",{},"VideoStore","，其中已有表 ",[30,35,36],{},"Publishers","：",[39,40,41,51],"table",{},[42,43,44],"thead",{},[45,46,47],"tr",{},[48,49,50],"th",{},"Publisher",[52,53,54,60],"tbody",{},[45,55,56],{},[57,58,59],"td",{},"Sunrise Press",[45,61,62],{},[57,63,64],{},"Northwind Books",[13,66,67,68,71,72,71,75,78],{},"下面围绕 ",[30,69,70],{},"GoodCustomers","、",[30,73,74],{},"shirts",[30,76,77],{},"PublisherWebsite"," 等表进行说明。",[80,81],"hr",{},[22,83,85],{"id":84},"_91-create-table-语法","9.1 CREATE TABLE 语法",[87,88,90],"h3",{"id":89},"_911-基本语法","9.1.1 基本语法",[92,93,98],"pre",{"className":94,"code":95,"language":96,"meta":97,"style":97},"language-sql shiki shiki-themes github-light github-dark","CREATE TABLE GoodCustomers (\n  CustomerID varchar(4) not null,\n  CustomerName varchar(50) not null,\n  Address varchar(65) not null,\n  PhoneNumber varchar(9),\n  MemberCategory varchar(10) not null,\n  PRIMARY KEY (CustomerID, MemberCategory)\n);\n","sql","",[30,99,100,120,145,164,184,200,219,228],{"__ignoreMap":97},[101,102,105,109,112,116],"span",{"class":103,"line":104},"line",1,[101,106,108],{"class":107},"szBVR","CREATE",[101,110,111],{"class":107}," TABLE",[101,113,115],{"class":114},"sScJk"," GoodCustomers",[101,117,119],{"class":118},"sVt8B"," (\n",[101,121,123,126,129,132,136,139,142],{"class":103,"line":122},2,[101,124,125],{"class":118},"  CustomerID ",[101,127,128],{"class":107},"varchar",[101,130,131],{"class":118},"(",[101,133,135],{"class":134},"sj4cs","4",[101,137,138],{"class":118},") ",[101,140,141],{"class":107},"not null",[101,143,144],{"class":118},",\n",[101,146,148,151,153,155,158,160,162],{"class":103,"line":147},3,[101,149,150],{"class":118},"  CustomerName ",[101,152,128],{"class":107},[101,154,131],{"class":118},[101,156,157],{"class":134},"50",[101,159,138],{"class":118},[101,161,141],{"class":107},[101,163,144],{"class":118},[101,165,167,170,173,175,178,180,182],{"class":103,"line":166},4,[101,168,169],{"class":107},"  Address",[101,171,172],{"class":107}," varchar",[101,174,131],{"class":118},[101,176,177],{"class":134},"65",[101,179,138],{"class":118},[101,181,141],{"class":107},[101,183,144],{"class":118},[101,185,187,190,192,194,197],{"class":103,"line":186},5,[101,188,189],{"class":118},"  PhoneNumber ",[101,191,128],{"class":107},[101,193,131],{"class":118},[101,195,196],{"class":134},"9",[101,198,199],{"class":118},"),\n",[101,201,203,206,208,210,213,215,217],{"class":103,"line":202},6,[101,204,205],{"class":118},"  MemberCategory ",[101,207,128],{"class":107},[101,209,131],{"class":118},[101,211,212],{"class":134},"10",[101,214,138],{"class":118},[101,216,141],{"class":107},[101,218,144],{"class":118},[101,220,222,225],{"class":103,"line":221},7,[101,223,224],{"class":107},"  PRIMARY KEY",[101,226,227],{"class":118}," (CustomerID, MemberCategory)\n",[101,229,231],{"class":103,"line":230},8,[101,232,233],{"class":118},");\n",[13,235,236],{},"注释：",[238,239,240,250,297],"ul",{},[241,242,243,246,247,249],"li",{},[30,244,245],{},"CREATE TABLE GoodCustomers","：创建名为 ",[30,248,70],{}," 的表。",[241,251,252,253],{},"表包含五列：\n",[238,254,255,264,272,280,289],{},[241,256,257,37,260,263],{},[30,258,259],{},"CustomerID",[30,261,262],{},"varchar(4)","，非空。",[241,265,266,37,269,263],{},[30,267,268],{},"CustomerName",[30,270,271],{},"varchar(50)",[241,273,274,37,277,263],{},[30,275,276],{},"Address",[30,278,279],{},"varchar(65)",[241,281,282,37,285,288],{},[30,283,284],{},"PhoneNumber",[30,286,287],{},"varchar(9)","，可为 NULL。",[241,290,291,37,294,263],{},[30,292,293],{},"MemberCategory",[30,295,296],{},"varchar(10)",[241,298,299,302],{},[30,300,301],{},"PRIMARY KEY (CustomerID, MemberCategory)","：复合主键，由两列组成。",[13,304,305],{},"作用：",[238,307,308,311,317,323],{},[241,309,310],{},"定义表结构、列名、列类型和约束。",[241,312,313,316],{},[30,314,315],{},"NOT NULL"," 表示该列插入时必须提供值。",[241,318,319,320,322],{},"不写 ",[30,321,315],{}," 的列默认可为 NULL。",[241,324,325],{},"复合主键要求两列组合唯一，且两列都不能为 NULL。",[13,327,328],{},"示例效果：",[92,330,335],{"className":331,"code":333,"language":334,"meta":97},[332],"language-text","创建后，GoodCustomers 表结构：\nCustomerID      varchar(4)   NOT NULL\nCustomerName    varchar(50)  NOT NULL\nAddress         varchar(65)  NOT NULL\nPhoneNumber     varchar(9)   NULL\nMemberCategory  varchar(10)  NOT NULL\n主键：(CustomerID, MemberCategory)\n","text",[30,336,333],{"__ignoreMap":97},[13,338,339],{},"插入示例：",[92,341,343],{"className":94,"code":342,"language":96,"meta":97,"style":97},"INSERT INTO GoodCustomers\n(CustomerID, CustomerName, Address, PhoneNumber, MemberCategory)\nVALUES\n('C001', 'Alice', 'Maple Ave', '11111111', 'Gold');\n\n-- 成功\n\nINSERT INTO GoodCustomers\n(CustomerID, CustomerName, Address, MemberCategory)\nVALUES\n('C002', 'Bob', 'Birch St', 'Silver');\n\n-- 成功，PhoneNumber 为 NULL\n\nINSERT INTO GoodCustomers\n(CustomerID, CustomerName, Address, PhoneNumber, MemberCategory)\nVALUES\n('C001', 'Alice', 'Maple Ave', '11111111', 'Gold');\n\n-- 失败：主键 (C001, Gold) 重复\n",[30,344,345,353,363,368,399,405,411,415,421,431,436,461,466,472,477,484,493,498,523,528],{"__ignoreMap":97},[101,346,347,350],{"class":103,"line":104},[101,348,349],{"class":107},"INSERT INTO",[101,351,352],{"class":118}," GoodCustomers\n",[101,354,355,358,360],{"class":103,"line":122},[101,356,357],{"class":118},"(CustomerID, CustomerName, ",[101,359,276],{"class":107},[101,361,362],{"class":118},", PhoneNumber, MemberCategory)\n",[101,364,365],{"class":103,"line":147},[101,366,367],{"class":107},"VALUES\n",[101,369,370,372,376,379,382,384,387,389,392,394,397],{"class":103,"line":166},[101,371,131],{"class":118},[101,373,375],{"class":374},"sZZnC","'C001'",[101,377,378],{"class":118},", ",[101,380,381],{"class":374},"'Alice'",[101,383,378],{"class":118},[101,385,386],{"class":374},"'Maple Ave'",[101,388,378],{"class":118},[101,390,391],{"class":374},"'11111111'",[101,393,378],{"class":118},[101,395,396],{"class":374},"'Gold'",[101,398,233],{"class":118},[101,400,401],{"class":103,"line":186},[101,402,404],{"emptyLinePlaceholder":403},true,"\n",[101,406,407],{"class":103,"line":202},[101,408,410],{"class":409},"sJ8bj","-- 成功\n",[101,412,413],{"class":103,"line":221},[101,414,404],{"emptyLinePlaceholder":403},[101,416,417,419],{"class":103,"line":230},[101,418,349],{"class":107},[101,420,352],{"class":118},[101,422,424,426,428],{"class":103,"line":423},9,[101,425,357],{"class":118},[101,427,276],{"class":107},[101,429,430],{"class":118},", MemberCategory)\n",[101,432,434],{"class":103,"line":433},10,[101,435,367],{"class":107},[101,437,439,441,444,446,449,451,454,456,459],{"class":103,"line":438},11,[101,440,131],{"class":118},[101,442,443],{"class":374},"'C002'",[101,445,378],{"class":118},[101,447,448],{"class":374},"'Bob'",[101,450,378],{"class":118},[101,452,453],{"class":374},"'Birch St'",[101,455,378],{"class":118},[101,457,458],{"class":374},"'Silver'",[101,460,233],{"class":118},[101,462,464],{"class":103,"line":463},12,[101,465,404],{"emptyLinePlaceholder":403},[101,467,469],{"class":103,"line":468},13,[101,470,471],{"class":409},"-- 成功，PhoneNumber 为 NULL\n",[101,473,475],{"class":103,"line":474},14,[101,476,404],{"emptyLinePlaceholder":403},[101,478,480,482],{"class":103,"line":479},15,[101,481,349],{"class":107},[101,483,352],{"class":118},[101,485,487,489,491],{"class":103,"line":486},16,[101,488,357],{"class":118},[101,490,276],{"class":107},[101,492,362],{"class":118},[101,494,496],{"class":103,"line":495},17,[101,497,367],{"class":107},[101,499,501,503,505,507,509,511,513,515,517,519,521],{"class":103,"line":500},18,[101,502,131],{"class":118},[101,504,375],{"class":374},[101,506,378],{"class":118},[101,508,381],{"class":374},[101,510,378],{"class":118},[101,512,386],{"class":374},[101,514,378],{"class":118},[101,516,391],{"class":374},[101,518,378],{"class":118},[101,520,396],{"class":374},[101,522,233],{"class":118},[101,524,526],{"class":103,"line":525},19,[101,527,404],{"emptyLinePlaceholder":403},[101,529,531],{"class":103,"line":530},20,[101,532,533],{"class":409},"-- 失败：主键 (C001, Gold) 重复\n",[80,535],{},[87,537,539],{"id":538},"_912-复合主键","9.1.2 复合主键",[92,541,543],{"className":94,"code":542,"language":96,"meta":97,"style":97},"PRIMARY KEY (CustomerID, MemberCategory)\n",[30,544,545],{"__ignoreMap":97},[101,546,547,550],{"class":103,"line":104},[101,548,549],{"class":107},"PRIMARY KEY",[101,551,227],{"class":118},[13,553,236],{},[238,555,556,559,568],{},[241,557,558],{},"复合主键由多列共同组成。",[241,560,561,562,564,565,567],{},"单独 ",[30,563,259],{}," 可以重复，单独 ",[30,566,293],{}," 也可以重复。",[241,569,570,571,574],{},"但 ",[30,572,573],{},"CustomerID + MemberCategory"," 的组合必须唯一。",[13,576,577],{},"示例：",[39,579,580,591],{},[42,581,582],{},[45,583,584,586,588],{},[48,585,259],{},[48,587,293],{},[48,589,590],{},"是否允许",[52,592,593,604,613,622],{},[45,594,595,598,601],{},[57,596,597],{},"C001",[57,599,600],{},"Gold",[57,602,603],{},"允许",[45,605,606,608,611],{},[57,607,597],{},[57,609,610],{},"Silver",[57,612,603],{},[45,614,615,618,620],{},[57,616,617],{},"C002",[57,619,600],{},[57,621,603],{},[45,623,624,626,628],{},[57,625,597],{},[57,627,600],{},[57,629,630],{},"不允许，重复",[13,632,305],{},[238,634,635,638],{},[241,636,637],{},"用于表示“多对多”关系中的联合唯一标识。",[241,639,640],{},"例如一个客户可以在不同会员类别下各有一条记录。",[80,642],{},[87,644,646],{"id":645},"_913-命名约束","9.1.3 命名约束",[13,648,649],{},"可使用命名约束的替代语法",[13,651,577],{},[92,653,655],{"className":94,"code":654,"language":96,"meta":97,"style":97},"CREATE TABLE GoodCustomers (\n  CustomerID varchar(4) not null,\n  CustomerName varchar(50) not null,\n  Address varchar(65) not null,\n  PhoneNumber varchar(9),\n  MemberCategory varchar(10) not null,\n  CONSTRAINT pk_good_customers\n    PRIMARY KEY (CustomerID, MemberCategory)\n);\n",[30,656,657,667,683,699,715,727,743,751,758],{"__ignoreMap":97},[101,658,659,661,663,665],{"class":103,"line":104},[101,660,108],{"class":107},[101,662,111],{"class":107},[101,664,115],{"class":114},[101,666,119],{"class":118},[101,668,669,671,673,675,677,679,681],{"class":103,"line":122},[101,670,125],{"class":118},[101,672,128],{"class":107},[101,674,131],{"class":118},[101,676,135],{"class":134},[101,678,138],{"class":118},[101,680,141],{"class":107},[101,682,144],{"class":118},[101,684,685,687,689,691,693,695,697],{"class":103,"line":147},[101,686,150],{"class":118},[101,688,128],{"class":107},[101,690,131],{"class":118},[101,692,157],{"class":134},[101,694,138],{"class":118},[101,696,141],{"class":107},[101,698,144],{"class":118},[101,700,701,703,705,707,709,711,713],{"class":103,"line":166},[101,702,169],{"class":107},[101,704,172],{"class":107},[101,706,131],{"class":118},[101,708,177],{"class":134},[101,710,138],{"class":118},[101,712,141],{"class":107},[101,714,144],{"class":118},[101,716,717,719,721,723,725],{"class":103,"line":186},[101,718,189],{"class":118},[101,720,128],{"class":107},[101,722,131],{"class":118},[101,724,196],{"class":134},[101,726,199],{"class":118},[101,728,729,731,733,735,737,739,741],{"class":103,"line":202},[101,730,205],{"class":118},[101,732,128],{"class":107},[101,734,131],{"class":118},[101,736,212],{"class":134},[101,738,138],{"class":118},[101,740,141],{"class":107},[101,742,144],{"class":118},[101,744,745,748],{"class":103,"line":221},[101,746,747],{"class":107},"  CONSTRAINT",[101,749,750],{"class":118}," pk_good_customers\n",[101,752,753,756],{"class":103,"line":230},[101,754,755],{"class":107},"    PRIMARY KEY",[101,757,227],{"class":118},[101,759,760],{"class":103,"line":423},[101,761,233],{"class":118},[13,763,236],{},[238,765,766,772,775],{},[241,767,768,771],{},[30,769,770],{},"CONSTRAINT pk_good_customers"," 给主键约束起名。",[241,773,774],{},"起名便于后续删除或修改约束。",[241,776,777],{},"不起名时，数据库会自动生成一个名称。",[13,779,780],{},"删除命名约束示例：",[92,782,784],{"className":94,"code":783,"language":96,"meta":97,"style":97},"ALTER TABLE GoodCustomers\nDROP CONSTRAINT pk_good_customers;\n",[30,785,786,795],{"__ignoreMap":97},[101,787,788,791,793],{"class":103,"line":104},[101,789,790],{"class":107},"ALTER",[101,792,111],{"class":107},[101,794,352],{"class":118},[101,796,797,800,803],{"class":103,"line":122},[101,798,799],{"class":107},"DROP",[101,801,802],{"class":107}," CONSTRAINT",[101,804,805],{"class":118}," pk_good_customers;\n",[13,807,305],{},[238,809,810,813],{},[241,811,812],{},"约束命名让数据库结构更清晰。",[241,814,815],{},"在迁移、维护时更容易定位约束。",[80,817],{},[22,819,821],{"id":820},"_92-数据类型选择","9.2 数据类型选择",[87,823,825],{"id":824},"_921-字符串类型","9.2.1 字符串类型",[92,827,830],{"className":828,"code":829,"language":334,"meta":97},[332],"VARCHAR(n)：变长字符串，n 是最大字符数，必须指定。\nCHAR(n)：定长字符串，最多 255 字符。\nTEXT：大文本，分 TINYTEXT \u002F TEXT \u002F MEDIUMTEXT \u002F LONGTEXT 四档（TEXT 上限 65535 字节，LONGTEXT 约 4GB），存储在行外，行内只留指针。\nENUM：固定常量字符串组，只能取列出的值之一。\n",[30,831,829],{"__ignoreMap":97},[13,833,834,835,839,840,843,844,847],{},"MySQL 没有单独的\"Unicode 字符串类型\"：列里的长度按",[836,837,838],"strong",{},"字符","算，一个字符占几字节由列的字符集决定。默认字符集是 ",[30,841,842],{},"utf8mb4","，所以 ",[30,845,846],{},"VARCHAR(40)"," 直接就能存中文、日文，不需要换成别的类型。",[13,849,850],{},"注释与示例：",[92,852,854],{"className":94,"code":853,"language":96,"meta":97,"style":97},"-- VARCHAR：变长，最常用\nCREATE TABLE ExampleVarchar (\n  Name VARCHAR(40)\n);\n\n-- CHAR：定长，适合国家代码这类长度固定的编码\nCREATE TABLE ExampleChar (\n  CountryCode CHAR(2)\n);\n\n-- TEXT：大文本，存储在行外\nCREATE TABLE ExampleText (\n  Description TEXT\n);\n",[30,855,856,861,872,888,892,896,901,912,927,931,935,940,951,959],{"__ignoreMap":97},[101,857,858],{"class":103,"line":104},[101,859,860],{"class":409},"-- VARCHAR：变长，最常用\n",[101,862,863,865,867,870],{"class":103,"line":122},[101,864,108],{"class":107},[101,866,111],{"class":107},[101,868,869],{"class":114}," ExampleVarchar",[101,871,119],{"class":118},[101,873,874,877,880,882,885],{"class":103,"line":147},[101,875,876],{"class":107},"  Name",[101,878,879],{"class":107}," VARCHAR",[101,881,131],{"class":118},[101,883,884],{"class":134},"40",[101,886,887],{"class":118},")\n",[101,889,890],{"class":103,"line":166},[101,891,233],{"class":118},[101,893,894],{"class":103,"line":186},[101,895,404],{"emptyLinePlaceholder":403},[101,897,898],{"class":103,"line":202},[101,899,900],{"class":409},"-- CHAR：定长，适合国家代码这类长度固定的编码\n",[101,902,903,905,907,910],{"class":103,"line":221},[101,904,108],{"class":107},[101,906,111],{"class":107},[101,908,909],{"class":114}," ExampleChar",[101,911,119],{"class":118},[101,913,914,917,920,922,925],{"class":103,"line":230},[101,915,916],{"class":118},"  CountryCode ",[101,918,919],{"class":107},"CHAR",[101,921,131],{"class":118},[101,923,924],{"class":134},"2",[101,926,887],{"class":118},[101,928,929],{"class":103,"line":423},[101,930,233],{"class":118},[101,932,933],{"class":103,"line":433},[101,934,404],{"emptyLinePlaceholder":403},[101,936,937],{"class":103,"line":438},[101,938,939],{"class":409},"-- TEXT：大文本，存储在行外\n",[101,941,942,944,946,949],{"class":103,"line":463},[101,943,108],{"class":107},[101,945,111],{"class":107},[101,947,948],{"class":114}," ExampleText",[101,950,119],{"class":118},[101,952,953,956],{"class":103,"line":468},[101,954,955],{"class":107},"  Description",[101,957,958],{"class":107}," TEXT\n",[101,960,961],{"class":103,"line":474},[101,962,233],{"class":118},[13,964,965,966,969],{},"同样的 ",[30,967,968],{},"VARCHAR"," 列，在 utf8mb4 下可以直接塞进中文：",[92,971,973],{"className":94,"code":972,"language":96,"meta":97,"style":97},"INSERT INTO ExampleVarchar (Name) VALUES ('张三');\nSELECT Name, CHAR_LENGTH(Name) AS 字符数, LENGTH(Name) AS 字节数 FROM ExampleVarchar;\n-- 张三   2   6\n",[30,974,975,998,1039],{"__ignoreMap":97},[101,976,977,979,982,985,987,990,993,996],{"class":103,"line":104},[101,978,349],{"class":107},[101,980,981],{"class":118}," ExampleVarchar (",[101,983,984],{"class":107},"Name",[101,986,138],{"class":118},[101,988,989],{"class":107},"VALUES",[101,991,992],{"class":118}," (",[101,994,995],{"class":374},"'张三'",[101,997,233],{"class":118},[101,999,1000,1003,1006,1009,1011,1013,1016,1019,1022,1024,1026,1028,1030,1033,1036],{"class":103,"line":122},[101,1001,1002],{"class":107},"SELECT",[101,1004,1005],{"class":107}," Name",[101,1007,1008],{"class":118},", CHAR_LENGTH(",[101,1010,984],{"class":107},[101,1012,138],{"class":118},[101,1014,1015],{"class":107},"AS",[101,1017,1018],{"class":118}," 字符数, ",[101,1020,1021],{"class":107},"LENGTH",[101,1023,131],{"class":118},[101,1025,984],{"class":107},[101,1027,138],{"class":118},[101,1029,1015],{"class":107},[101,1031,1032],{"class":118}," 字节数 ",[101,1034,1035],{"class":107},"FROM",[101,1037,1038],{"class":118}," ExampleVarchar;\n",[101,1040,1041],{"class":103,"line":147},[101,1042,1043],{"class":409},"-- 张三   2   6\n",[13,1045,1046],{},"作用对比：",[39,1048,1049,1065],{},[42,1050,1051],{},[45,1052,1053,1056,1059,1062],{},[48,1054,1055],{},"类型",[48,1057,1058],{},"是否变长",[48,1060,1061],{},"长度怎么算",[48,1063,1064],{},"适用场景",[52,1066,1067,1085,1101,1116],{},[45,1068,1069,1074,1077,1082],{},[57,1070,1071],{},[30,1072,1073],{},"VARCHAR(n)",[57,1075,1076],{},"是",[57,1078,1079,1080],{},"最多 n 个",[836,1081,838],{},[57,1083,1084],{},"姓名、邮箱、标题这类文本",[45,1086,1087,1092,1095,1098],{},[57,1088,1089],{},[30,1090,1091],{},"CHAR(n)",[57,1093,1094],{},"否",[57,1096,1097],{},"固定 n 个字符",[57,1099,1100],{},"国家代码、状态码",[45,1102,1103,1108,1110,1113],{},[57,1104,1105],{},[30,1106,1107],{},"TEXT",[57,1109,1076],{},[57,1111,1112],{},"上限以字节计",[57,1114,1115],{},"文章正文、备注这类大段文本",[45,1117,1118,1123,1125,1128],{},[57,1119,1120],{},[30,1121,1122],{},"ENUM",[57,1124,1094],{},[57,1126,1127],{},"只能取列出的常量",[57,1129,1130],{},"状态、尺寸、类别等有限选项",[13,1132,577],{},[92,1134,1136],{"className":94,"code":1135,"language":96,"meta":97,"style":97},"CREATE TABLE shirts (\n  name VARCHAR(40),\n  size ENUM('x-small', 'small', 'medium', 'large', 'x-large')\n);\n\nINSERT INTO shirts (name, size) VALUES\n('dress shirt', 'large'),\n('t-shirt', 'medium'),\n('polo shirt', 'small');\n\nSELECT name, size FROM shirts WHERE size = 'medium';\n",[30,1137,1138,1149,1162,1195,1199,1203,1222,1235,1248,1261,1265],{"__ignoreMap":97},[101,1139,1140,1142,1144,1147],{"class":103,"line":104},[101,1141,108],{"class":107},[101,1143,111],{"class":107},[101,1145,1146],{"class":114}," shirts",[101,1148,119],{"class":118},[101,1150,1151,1154,1156,1158,1160],{"class":103,"line":122},[101,1152,1153],{"class":107},"  name",[101,1155,879],{"class":107},[101,1157,131],{"class":118},[101,1159,884],{"class":134},[101,1161,199],{"class":118},[101,1163,1164,1167,1170,1173,1175,1178,1180,1183,1185,1188,1190,1193],{"class":103,"line":147},[101,1165,1166],{"class":107},"  size",[101,1168,1169],{"class":118}," ENUM(",[101,1171,1172],{"class":374},"'x-small'",[101,1174,378],{"class":118},[101,1176,1177],{"class":374},"'small'",[101,1179,378],{"class":118},[101,1181,1182],{"class":374},"'medium'",[101,1184,378],{"class":118},[101,1186,1187],{"class":374},"'large'",[101,1189,378],{"class":118},[101,1191,1192],{"class":374},"'x-large'",[101,1194,887],{"class":118},[101,1196,1197],{"class":103,"line":166},[101,1198,233],{"class":118},[101,1200,1201],{"class":103,"line":186},[101,1202,404],{"emptyLinePlaceholder":403},[101,1204,1205,1207,1210,1213,1215,1218,1220],{"class":103,"line":202},[101,1206,349],{"class":107},[101,1208,1209],{"class":118}," shirts (",[101,1211,1212],{"class":107},"name",[101,1214,378],{"class":118},[101,1216,1217],{"class":107},"size",[101,1219,138],{"class":118},[101,1221,367],{"class":107},[101,1223,1224,1226,1229,1231,1233],{"class":103,"line":221},[101,1225,131],{"class":118},[101,1227,1228],{"class":374},"'dress shirt'",[101,1230,378],{"class":118},[101,1232,1187],{"class":374},[101,1234,199],{"class":118},[101,1236,1237,1239,1242,1244,1246],{"class":103,"line":230},[101,1238,131],{"class":118},[101,1240,1241],{"class":374},"'t-shirt'",[101,1243,378],{"class":118},[101,1245,1182],{"class":374},[101,1247,199],{"class":118},[101,1249,1250,1252,1255,1257,1259],{"class":103,"line":423},[101,1251,131],{"class":118},[101,1253,1254],{"class":374},"'polo shirt'",[101,1256,378],{"class":118},[101,1258,1177],{"class":374},[101,1260,233],{"class":118},[101,1262,1263],{"class":103,"line":433},[101,1264,404],{"emptyLinePlaceholder":403},[101,1266,1267,1269,1272,1274,1276,1279,1282,1285,1288,1291,1294],{"class":103,"line":438},[101,1268,1002],{"class":107},[101,1270,1271],{"class":107}," name",[101,1273,378],{"class":118},[101,1275,1217],{"class":107},[101,1277,1278],{"class":107}," FROM",[101,1280,1281],{"class":118}," shirts ",[101,1283,1284],{"class":107},"WHERE",[101,1286,1287],{"class":107}," size",[101,1289,1290],{"class":107}," =",[101,1292,1293],{"class":374}," 'medium'",[101,1295,1296],{"class":118},";\n",[13,1298,1299],{},"执行效果：",[92,1301,1304],{"className":1302,"code":1303,"language":334,"meta":97},[332],"name         size\n-----------  -------\nt-shirt      medium\n",[30,1305,1303],{"__ignoreMap":97},[13,1307,236],{},[238,1309,1310,1315,1318,1330],{},[241,1311,1312,1314],{},[30,1313,1122],{}," 限定只能取列出的值。",[241,1316,1317],{},"插入未列出的值会失败或警告，取决于数据库设置。",[241,1319,1320,1322,1323,1325,1326,1329],{},[30,1321,968],{}," \u002F ",[30,1324,919],{}," 都必须指定长度，MySQL 里这个长度算的是",[836,1327,1328],{},"字符数","，不是字节数。",[241,1331,1332,1334],{},[30,1333,1107],{}," 通常不能直接设默认值，也不能直接建普通索引，具体取决于数据库。",[80,1336],{},[87,1338,1340],{"id":1339},"_922-数值类型","9.2.2 数值类型",[92,1342,1345],{"className":1343,"code":1344,"language":334,"meta":97},[332],"INT：整数。\nDECIMAL(M, D)：精确数值，M 为总位数（精度），D 为小数位数。例如 100.45 是 DECIMAL(5,2)。最多 65 位。用于财务数据。\nDOUBLE：近似数值，最多 15 位小数。\nFLOAT：近似数值，最多 7 位小数。\n",[30,1346,1344],{"__ignoreMap":97},[13,1348,850],{},[92,1350,1352],{"className":94,"code":1351,"language":96,"meta":97,"style":97},"CREATE TABLE Product (\n  Id INT,\n  Price DECIMAL(10,2),\n  Weight DOUBLE,\n  Temperature FLOAT\n);\n",[30,1353,1354,1365,1375,1394,1402,1410],{"__ignoreMap":97},[101,1355,1356,1358,1360,1363],{"class":103,"line":104},[101,1357,108],{"class":107},[101,1359,111],{"class":107},[101,1361,1362],{"class":114}," Product",[101,1364,119],{"class":118},[101,1366,1367,1370,1373],{"class":103,"line":122},[101,1368,1369],{"class":118},"  Id ",[101,1371,1372],{"class":107},"INT",[101,1374,144],{"class":118},[101,1376,1377,1380,1383,1385,1387,1390,1392],{"class":103,"line":147},[101,1378,1379],{"class":118},"  Price ",[101,1381,1382],{"class":107},"DECIMAL",[101,1384,131],{"class":118},[101,1386,212],{"class":134},[101,1388,1389],{"class":118},",",[101,1391,924],{"class":134},[101,1393,199],{"class":118},[101,1395,1396,1399],{"class":103,"line":166},[101,1397,1398],{"class":107},"  Weight",[101,1400,1401],{"class":118}," DOUBLE,\n",[101,1403,1404,1407],{"class":103,"line":186},[101,1405,1406],{"class":118},"  Temperature ",[101,1408,1409],{"class":107},"FLOAT\n",[101,1411,1412],{"class":103,"line":202},[101,1413,233],{"class":118},[13,1415,1416],{},"解释：",[238,1418,1419,1434,1443,1449],{},[241,1420,1421,1423,1424,71,1427,71,1430,1433],{},[30,1422,1372],{},"：整数，例如 ",[30,1425,1426],{},"1",[30,1428,1429],{},"100",[30,1431,1432],{},"-5","。",[241,1435,1436,1439,1440,1433],{},[30,1437,1438],{},"DECIMAL(10,2)","：总共 10 位，其中 2 位小数。例如 ",[30,1441,1442],{},"12345678.90",[241,1444,1445,1448],{},[30,1446,1447],{},"DOUBLE","：双精度浮点，约 15 位有效数字。",[241,1450,1451,1454],{},[30,1452,1453],{},"FLOAT","：单精度浮点，约 7 位有效数字。",[13,1456,1457],{},"精确与近似：",[92,1459,1461],{"className":94,"code":1460,"language":96,"meta":97,"style":97},"-- DECIMAL 精确计算\nSELECT CAST(0.1 AS DECIMAL(5,2)) + CAST(0.2 AS DECIMAL(5,2));\n-- 结果：0.30\n\n-- 注意：MySQL 里直接写 0.1 + 0.2 得到的是 0.3，\n-- 因为这两个字面量被当作 DECIMAL 处理，没有经过浮点\nSELECT 0.1 + 0.2;\n-- 结果：0.3\n\n-- 想看到浮点误差，得显式用浮点数\nSELECT 0.1E0 + 0.2E0;\n-- 结果：0.30000000000000004\n",[30,1462,1463,1468,1531,1536,1540,1545,1550,1572,1577,1581,1586,1602],{"__ignoreMap":97},[101,1464,1465],{"class":103,"line":104},[101,1466,1467],{"class":409},"-- DECIMAL 精确计算\n",[101,1469,1470,1472,1475,1477,1480,1483,1485,1488,1491,1493,1496,1498,1500,1503,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528],{"class":103,"line":122},[101,1471,1002],{"class":107},[101,1473,1474],{"class":134}," CAST",[101,1476,131],{"class":118},[101,1478,1479],{"class":134},"0",[101,1481,1482],{"class":118},".",[101,1484,1426],{"class":134},[101,1486,1487],{"class":107}," AS",[101,1489,1490],{"class":107}," DECIMAL",[101,1492,131],{"class":118},[101,1494,1495],{"class":134},"5",[101,1497,1389],{"class":118},[101,1499,924],{"class":134},[101,1501,1502],{"class":118},")) ",[101,1504,1505],{"class":107},"+",[101,1507,1474],{"class":134},[101,1509,131],{"class":118},[101,1511,1479],{"class":134},[101,1513,1482],{"class":118},[101,1515,924],{"class":134},[101,1517,1487],{"class":107},[101,1519,1490],{"class":107},[101,1521,131],{"class":118},[101,1523,1495],{"class":134},[101,1525,1389],{"class":118},[101,1527,924],{"class":134},[101,1529,1530],{"class":118},"));\n",[101,1532,1533],{"class":103,"line":147},[101,1534,1535],{"class":409},"-- 结果：0.30\n",[101,1537,1538],{"class":103,"line":166},[101,1539,404],{"emptyLinePlaceholder":403},[101,1541,1542],{"class":103,"line":186},[101,1543,1544],{"class":409},"-- 注意：MySQL 里直接写 0.1 + 0.2 得到的是 0.3，\n",[101,1546,1547],{"class":103,"line":202},[101,1548,1549],{"class":409},"-- 因为这两个字面量被当作 DECIMAL 处理，没有经过浮点\n",[101,1551,1552,1554,1557,1559,1561,1564,1566,1568,1570],{"class":103,"line":221},[101,1553,1002],{"class":107},[101,1555,1556],{"class":134}," 0",[101,1558,1482],{"class":118},[101,1560,1426],{"class":134},[101,1562,1563],{"class":107}," +",[101,1565,1556],{"class":134},[101,1567,1482],{"class":118},[101,1569,924],{"class":134},[101,1571,1296],{"class":118},[101,1573,1574],{"class":103,"line":230},[101,1575,1576],{"class":409},"-- 结果：0.3\n",[101,1578,1579],{"class":103,"line":423},[101,1580,404],{"emptyLinePlaceholder":403},[101,1582,1583],{"class":103,"line":433},[101,1584,1585],{"class":409},"-- 想看到浮点误差，得显式用浮点数\n",[101,1587,1588,1590,1592,1595,1597,1599],{"class":103,"line":438},[101,1589,1002],{"class":107},[101,1591,1556],{"class":134},[101,1593,1594],{"class":118},".1E0 ",[101,1596,1505],{"class":107},[101,1598,1556],{"class":134},[101,1600,1601],{"class":118},".2E0;\n",[101,1603,1604],{"class":103,"line":463},[101,1605,1606],{"class":409},"-- 结果：0.30000000000000004\n",[13,1608,305],{},[238,1610,1611,1617,1622,1627],{},[241,1612,1613,1614,1616],{},"财务数据必须使用 ",[30,1615,1382],{},"，避免浮点误差。",[241,1618,1619,1620,1433],{},"GPS 坐标、科学测量可用 ",[30,1621,1447],{},[241,1623,1624,1625,1433],{},"温度等精度要求不高的可用 ",[30,1626,1453],{},[241,1628,1629,1631],{},[30,1630,1372],{}," 用于计数、编号、年龄等。",[13,1633,577],{},[92,1635,1637],{"className":94,"code":1636,"language":96,"meta":97,"style":97},"CREATE TABLE FinancialRecord (\n  Id INT PRIMARY KEY,\n  Amount DECIMAL(10,2) NOT NULL,\n  TaxRate FLOAT,\n  Latitude DOUBLE\n);\n",[30,1638,1639,1650,1661,1682,1691,1696],{"__ignoreMap":97},[101,1640,1641,1643,1645,1648],{"class":103,"line":104},[101,1642,108],{"class":107},[101,1644,111],{"class":107},[101,1646,1647],{"class":114}," FinancialRecord",[101,1649,119],{"class":118},[101,1651,1652,1654,1656,1659],{"class":103,"line":122},[101,1653,1369],{"class":118},[101,1655,1372],{"class":107},[101,1657,1658],{"class":107}," PRIMARY KEY",[101,1660,144],{"class":118},[101,1662,1663,1666,1668,1670,1672,1674,1676,1678,1680],{"class":103,"line":147},[101,1664,1665],{"class":118},"  Amount ",[101,1667,1382],{"class":107},[101,1669,131],{"class":118},[101,1671,212],{"class":134},[101,1673,1389],{"class":118},[101,1675,924],{"class":134},[101,1677,138],{"class":118},[101,1679,315],{"class":107},[101,1681,144],{"class":118},[101,1683,1684,1687,1689],{"class":103,"line":166},[101,1685,1686],{"class":118},"  TaxRate ",[101,1688,1453],{"class":107},[101,1690,144],{"class":118},[101,1692,1693],{"class":103,"line":186},[101,1694,1695],{"class":118},"  Latitude DOUBLE\n",[101,1697,1698],{"class":103,"line":202},[101,1699,233],{"class":118},[80,1701],{},[87,1703,1705],{"id":1704},"_923-日期时间类型","9.2.3 日期时间类型",[92,1707,1710],{"className":1708,"code":1709,"language":334,"meta":97},[332],"DATE, DATETIME, TIMESTAMP\n",[30,1711,1709],{"__ignoreMap":97},[13,1713,850],{},[92,1715,1717],{"className":94,"code":1716,"language":96,"meta":97,"style":97},"CREATE TABLE Event (\n  EventId INT PRIMARY KEY,\n  EventDate DATE,\n  CreatedAt DATETIME,\n  UpdatedAt TIMESTAMP\n);\n",[30,1718,1719,1730,1741,1751,1761,1769],{"__ignoreMap":97},[101,1720,1721,1723,1725,1728],{"class":103,"line":104},[101,1722,108],{"class":107},[101,1724,111],{"class":107},[101,1726,1727],{"class":114}," Event",[101,1729,119],{"class":118},[101,1731,1732,1735,1737,1739],{"class":103,"line":122},[101,1733,1734],{"class":118},"  EventId ",[101,1736,1372],{"class":107},[101,1738,1658],{"class":107},[101,1740,144],{"class":118},[101,1742,1743,1746,1749],{"class":103,"line":147},[101,1744,1745],{"class":118},"  EventDate ",[101,1747,1748],{"class":107},"DATE",[101,1750,144],{"class":118},[101,1752,1753,1756,1759],{"class":103,"line":166},[101,1754,1755],{"class":118},"  CreatedAt ",[101,1757,1758],{"class":107},"DATETIME",[101,1760,144],{"class":118},[101,1762,1763,1766],{"class":103,"line":186},[101,1764,1765],{"class":118},"  UpdatedAt ",[101,1767,1768],{"class":107},"TIMESTAMP\n",[101,1770,1771],{"class":103,"line":202},[101,1772,233],{"class":118},[13,1774,1416],{},[238,1776,1777,1785,1793],{},[241,1778,1779,1781,1782,1433],{},[30,1780,1748],{},"：只存日期，例如 ",[30,1783,1784],{},"2026-10-10",[241,1786,1787,1789,1790,1433],{},[30,1788,1758],{},"：日期和时间，例如 ",[30,1791,1792],{},"2026-10-10 14:30:00",[241,1794,1795,1798],{},[30,1796,1797],{},"TIMESTAMP","：时间戳，通常与时区有关，不同数据库行为不同。",[13,1800,339],{},[92,1802,1804],{"className":94,"code":1803,"language":96,"meta":97,"style":97},"INSERT INTO Event (EventId, EventDate, CreatedAt, UpdatedAt)\nVALUES (1, '2026-10-10', '2026-10-10 14:30:00', CURRENT_TIMESTAMP);\n",[30,1805,1806,1815],{"__ignoreMap":97},[101,1807,1808,1810,1812],{"class":103,"line":104},[101,1809,349],{"class":107},[101,1811,1727],{"class":107},[101,1813,1814],{"class":118}," (EventId, EventDate, CreatedAt, UpdatedAt)\n",[101,1816,1817,1819,1821,1823,1825,1828,1830,1833],{"class":103,"line":122},[101,1818,989],{"class":107},[101,1820,992],{"class":118},[101,1822,1426],{"class":134},[101,1824,378],{"class":118},[101,1826,1827],{"class":374},"'2026-10-10'",[101,1829,378],{"class":118},[101,1831,1832],{"class":374},"'2026-10-10 14:30:00'",[101,1834,1835],{"class":118},", CURRENT_TIMESTAMP);\n",[13,1837,305],{},[238,1839,1840,1845,1850],{},[241,1841,1842,1844],{},[30,1843,1748],{}," 用于生日、节假日等。",[241,1846,1847,1849],{},[30,1848,1758],{}," 用于订单创建时间、日志时间。",[241,1851,1852,1854],{},[30,1853,1797],{}," 常用于记录最后修改时间。",[80,1856],{},[87,1858,1860],{"id":1859},"_924-enum-类型","9.2.4 ENUM 类型",[92,1862,1864],{"className":94,"code":1863,"language":96,"meta":97,"style":97},"CREATE TABLE shirts (\n  name VARCHAR(40),\n  size ENUM('x-small', 'small', 'medium', 'large', 'x-large')\n);\n",[30,1865,1866,1876,1888,1914],{"__ignoreMap":97},[101,1867,1868,1870,1872,1874],{"class":103,"line":104},[101,1869,108],{"class":107},[101,1871,111],{"class":107},[101,1873,1146],{"class":114},[101,1875,119],{"class":118},[101,1877,1878,1880,1882,1884,1886],{"class":103,"line":122},[101,1879,1153],{"class":107},[101,1881,879],{"class":107},[101,1883,131],{"class":118},[101,1885,884],{"class":134},[101,1887,199],{"class":118},[101,1889,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912],{"class":103,"line":147},[101,1891,1166],{"class":107},[101,1893,1169],{"class":118},[101,1895,1172],{"class":374},[101,1897,378],{"class":118},[101,1899,1177],{"class":374},[101,1901,378],{"class":118},[101,1903,1182],{"class":374},[101,1905,378],{"class":118},[101,1907,1187],{"class":374},[101,1909,378],{"class":118},[101,1911,1192],{"class":374},[101,1913,887],{"class":118},[101,1915,1916],{"class":103,"line":166},[101,1917,233],{"class":118},[13,1919,236],{},[238,1921,1922,1927,1930],{},[241,1923,1924,1926],{},[30,1925,1122],{}," 是固定常量字符串组。",[241,1928,1929],{},"只能插入列出的值之一。",[241,1931,1932],{},"适合状态、尺寸、类别等有限选项。",[13,1934,339],{},[92,1936,1938],{"className":94,"code":1937,"language":96,"meta":97,"style":97},"INSERT INTO shirts (name, size) VALUES ('dress shirt', 'large');\nINSERT INTO shirts (name, size) VALUES ('t-shirt', 'medium');\nINSERT INTO shirts (name, size) VALUES ('polo shirt', 'small');\n\n-- 插入不存在的值会失败\nINSERT INTO shirts (name, size) VALUES ('hat', 'extra-large');\n-- 错误：'extra-large' 不在 ENUM 列表中\n",[30,1939,1940,1966,1992,2018,2022,2027,2055],{"__ignoreMap":97},[101,1941,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964],{"class":103,"line":104},[101,1943,349],{"class":107},[101,1945,1209],{"class":118},[101,1947,1212],{"class":107},[101,1949,378],{"class":118},[101,1951,1217],{"class":107},[101,1953,138],{"class":118},[101,1955,989],{"class":107},[101,1957,992],{"class":118},[101,1959,1228],{"class":374},[101,1961,378],{"class":118},[101,1963,1187],{"class":374},[101,1965,233],{"class":118},[101,1967,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990],{"class":103,"line":122},[101,1969,349],{"class":107},[101,1971,1209],{"class":118},[101,1973,1212],{"class":107},[101,1975,378],{"class":118},[101,1977,1217],{"class":107},[101,1979,138],{"class":118},[101,1981,989],{"class":107},[101,1983,992],{"class":118},[101,1985,1241],{"class":374},[101,1987,378],{"class":118},[101,1989,1182],{"class":374},[101,1991,233],{"class":118},[101,1993,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2014,2016],{"class":103,"line":147},[101,1995,349],{"class":107},[101,1997,1209],{"class":118},[101,1999,1212],{"class":107},[101,2001,378],{"class":118},[101,2003,1217],{"class":107},[101,2005,138],{"class":118},[101,2007,989],{"class":107},[101,2009,992],{"class":118},[101,2011,1254],{"class":374},[101,2013,378],{"class":118},[101,2015,1177],{"class":374},[101,2017,233],{"class":118},[101,2019,2020],{"class":103,"line":166},[101,2021,404],{"emptyLinePlaceholder":403},[101,2023,2024],{"class":103,"line":186},[101,2025,2026],{"class":409},"-- 插入不存在的值会失败\n",[101,2028,2029,2031,2033,2035,2037,2039,2041,2043,2045,2048,2050,2053],{"class":103,"line":202},[101,2030,349],{"class":107},[101,2032,1209],{"class":118},[101,2034,1212],{"class":107},[101,2036,378],{"class":118},[101,2038,1217],{"class":107},[101,2040,138],{"class":118},[101,2042,989],{"class":107},[101,2044,992],{"class":118},[101,2046,2047],{"class":374},"'hat'",[101,2049,378],{"class":118},[101,2051,2052],{"class":374},"'extra-large'",[101,2054,233],{"class":118},[101,2056,2057],{"class":103,"line":221},[101,2058,2059],{"class":409},"-- 错误：'extra-large' 不在 ENUM 列表中\n",[13,2061,2062],{},"查询示例：",[92,2064,2066],{"className":94,"code":2065,"language":96,"meta":97,"style":97},"SELECT name, size FROM shirts WHERE size = 'medium';\n-- 结果：t-shirt | medium\n",[30,2067,2068,2092],{"__ignoreMap":97},[101,2069,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090],{"class":103,"line":104},[101,2071,1002],{"class":107},[101,2073,1271],{"class":107},[101,2075,378],{"class":118},[101,2077,1217],{"class":107},[101,2079,1278],{"class":107},[101,2081,1281],{"class":118},[101,2083,1284],{"class":107},[101,2085,1287],{"class":107},[101,2087,1290],{"class":107},[101,2089,1293],{"class":374},[101,2091,1296],{"class":118},[101,2093,2094],{"class":103,"line":122},[101,2095,2096],{"class":409},"-- 结果：t-shirt | medium\n",[13,2098,305],{},[238,2100,2101,2104,2107],{},[241,2102,2103],{},"限制取值范围，保证数据一致性。",[241,2105,2106],{},"比自由文本更安全。",[241,2108,2109],{},"不同数据库对 ENUM 支持不同，MySQL 支持较好，SQL Server 无直接 ENUM。",[80,2111],{},[22,2113,2115],{"id":2114},"_93-外键定义","9.3 外键定义",[92,2117,2119],{"className":94,"code":2118,"language":96,"meta":97,"style":97},"CREATE TABLE PublisherWebsite (\n  Publisher varchar(50) not null,\n  WebSite varchar(200) not null,\n  PRIMARY KEY (Publisher),\n  FOREIGN KEY (Publisher) REFERENCES Publishers (Publisher)\n);\n-- 外键的本地列名必须用括号，否则会报错，亲测易错\n",[30,2120,2121,2132,2149,2167,2174,2188,2192],{"__ignoreMap":97},[101,2122,2123,2125,2127,2130],{"class":103,"line":104},[101,2124,108],{"class":107},[101,2126,111],{"class":107},[101,2128,2129],{"class":114}," PublisherWebsite",[101,2131,119],{"class":118},[101,2133,2134,2137,2139,2141,2143,2145,2147],{"class":103,"line":122},[101,2135,2136],{"class":118},"  Publisher ",[101,2138,128],{"class":107},[101,2140,131],{"class":118},[101,2142,157],{"class":134},[101,2144,138],{"class":118},[101,2146,141],{"class":107},[101,2148,144],{"class":118},[101,2150,2151,2154,2156,2158,2161,2163,2165],{"class":103,"line":147},[101,2152,2153],{"class":118},"  WebSite ",[101,2155,128],{"class":107},[101,2157,131],{"class":118},[101,2159,2160],{"class":134},"200",[101,2162,138],{"class":118},[101,2164,141],{"class":107},[101,2166,144],{"class":118},[101,2168,2169,2171],{"class":103,"line":166},[101,2170,224],{"class":107},[101,2172,2173],{"class":118}," (Publisher),\n",[101,2175,2176,2179,2182,2185],{"class":103,"line":186},[101,2177,2178],{"class":107},"  FOREIGN KEY",[101,2180,2181],{"class":118}," (Publisher) ",[101,2183,2184],{"class":107},"REFERENCES",[101,2186,2187],{"class":118}," Publishers (Publisher)\n",[101,2189,2190],{"class":103,"line":202},[101,2191,233],{"class":118},[101,2193,2194],{"class":103,"line":221},[101,2195,2196],{"class":409},"-- 外键的本地列名必须用括号，否则会报错，亲测易错\n",[13,2198,236],{},[238,2200,2201,2206,2211],{},[241,2202,2203,2205],{},[30,2204,77],{}," 表记录出版社及其官网。",[241,2207,2208,2210],{},[30,2209,50],{}," 是主键，也是外键。",[241,2212,2213,2216,2217],{},[30,2214,2215],{},"FOREIGN KEY (Publisher) REFERENCES Publishers (Publisher)","：\n",[238,2218,2219,2231],{},[241,2220,2221,2222,2224,2225,2227,2228,2230],{},"本表的 ",[30,2223,50],{}," 列引用 ",[30,2226,36],{}," 表的 ",[30,2229,50],{}," 列。",[241,2232,2233,2234,2236,2237,2239,2240,2242],{},"插入 ",[30,2235,77],{}," 时，",[30,2238,50],{}," 必须已存在于 ",[30,2241,36],{}," 表中。",[13,2244,328],{},[13,2246,2247,2248,2250],{},"假设 ",[30,2249,36],{}," 表数据：",[39,2252,2253,2259],{},[42,2254,2255],{},[45,2256,2257],{},[48,2258,50],{},[52,2260,2261,2265],{},[45,2262,2263],{},[57,2264,59],{},[45,2266,2267],{},[57,2268,64],{},[13,2270,2271],{},"插入成功：",[92,2273,2275],{"className":94,"code":2274,"language":96,"meta":97,"style":97},"INSERT INTO PublisherWebsite (Publisher, WebSite)\nVALUES ('Sunrise Press', 'www.timvideocompany.com');\n",[30,2276,2277,2284],{"__ignoreMap":97},[101,2278,2279,2281],{"class":103,"line":104},[101,2280,349],{"class":107},[101,2282,2283],{"class":118}," PublisherWebsite (Publisher, WebSite)\n",[101,2285,2286,2288,2290,2293,2295,2298],{"class":103,"line":122},[101,2287,989],{"class":107},[101,2289,992],{"class":118},[101,2291,2292],{"class":374},"'Sunrise Press'",[101,2294,378],{"class":118},[101,2296,2297],{"class":374},"'www.timvideocompany.com'",[101,2299,233],{"class":118},[13,2301,2302],{},"插入失败：",[92,2304,2306],{"className":94,"code":2305,"language":96,"meta":97,"style":97},"INSERT INTO PublisherWebsite (Publisher, WebSite)\nVALUES ('UnknownPublisher', 'www.unknown.com');\n-- 失败：Publishers 表中没有 UnknownPublisher\n",[30,2307,2308,2314,2330],{"__ignoreMap":97},[101,2309,2310,2312],{"class":103,"line":104},[101,2311,349],{"class":107},[101,2313,2283],{"class":118},[101,2315,2316,2318,2320,2323,2325,2328],{"class":103,"line":122},[101,2317,989],{"class":107},[101,2319,992],{"class":118},[101,2321,2322],{"class":374},"'UnknownPublisher'",[101,2324,378],{"class":118},[101,2326,2327],{"class":374},"'www.unknown.com'",[101,2329,233],{"class":118},[101,2331,2332],{"class":103,"line":147},[101,2333,2334],{"class":409},"-- 失败：Publishers 表中没有 UnknownPublisher\n",[13,2336,2337],{},"命名约束替代语法：",[92,2339,2341],{"className":94,"code":2340,"language":96,"meta":97,"style":97},"CREATE TABLE PublisherWebsite (\n  Publisher varchar(50) not null,\n  WebSite varchar(200) not null,\n  PRIMARY KEY (Publisher),\n  CONSTRAINT fk_producer_website\n    FOREIGN KEY (Publisher) REFERENCES Publishers (Publisher)\n);\n",[30,2342,2343,2353,2369,2385,2391,2398,2409],{"__ignoreMap":97},[101,2344,2345,2347,2349,2351],{"class":103,"line":104},[101,2346,108],{"class":107},[101,2348,111],{"class":107},[101,2350,2129],{"class":114},[101,2352,119],{"class":118},[101,2354,2355,2357,2359,2361,2363,2365,2367],{"class":103,"line":122},[101,2356,2136],{"class":118},[101,2358,128],{"class":107},[101,2360,131],{"class":118},[101,2362,157],{"class":134},[101,2364,138],{"class":118},[101,2366,141],{"class":107},[101,2368,144],{"class":118},[101,2370,2371,2373,2375,2377,2379,2381,2383],{"class":103,"line":147},[101,2372,2153],{"class":118},[101,2374,128],{"class":107},[101,2376,131],{"class":118},[101,2378,2160],{"class":134},[101,2380,138],{"class":118},[101,2382,141],{"class":107},[101,2384,144],{"class":118},[101,2386,2387,2389],{"class":103,"line":166},[101,2388,224],{"class":107},[101,2390,2173],{"class":118},[101,2392,2393,2395],{"class":103,"line":186},[101,2394,747],{"class":107},[101,2396,2397],{"class":118}," fk_producer_website\n",[101,2399,2400,2403,2405,2407],{"class":103,"line":202},[101,2401,2402],{"class":107},"    FOREIGN KEY",[101,2404,2181],{"class":118},[101,2406,2184],{"class":107},[101,2408,2187],{"class":118},[101,2410,2411],{"class":103,"line":221},[101,2412,233],{"class":118},[13,2414,236],{},[238,2416,2417,2420],{},[241,2418,2419],{},"给外键约束命名，便于后续维护。",[241,2421,2422],{},"删除外键约束时使用该名称。",[13,2424,2425],{},"删除外键示例：",[92,2427,2429],{"className":94,"code":2428,"language":96,"meta":97,"style":97},"ALTER TABLE PublisherWebsite\nDROP CONSTRAINT fk_producer_website;\n",[30,2430,2431,2440],{"__ignoreMap":97},[101,2432,2433,2435,2437],{"class":103,"line":104},[101,2434,790],{"class":107},[101,2436,111],{"class":107},[101,2438,2439],{"class":118}," PublisherWebsite\n",[101,2441,2442,2444,2446],{"class":103,"line":122},[101,2443,799],{"class":107},[101,2445,802],{"class":107},[101,2447,2448],{"class":118}," fk_producer_website;\n",[13,2450,305],{},[238,2452,2453,2456,2459],{},[241,2454,2455],{},"保证引用完整性。",[241,2457,2458],{},"防止插入不存在的出版社。",[241,2460,2461],{},"防止删除仍被引用的出版社，除非设置了级联规则。",[80,2463],{},[22,2465,2467],{"id":2466},"_94-本章核心记忆点","9.4 本章核心记忆点",[92,2469,2472],{"className":2470,"code":2471,"language":334,"meta":97},[332],"CREATE TABLE 定义表结构：列名、类型、约束。\nNOT NULL 表示必填，不写则可为 NULL。\nPRIMARY KEY 唯一标识一行，可以是复合主键。\n字符串：VARCHAR 变长（长度按字符数算），CHAR 定长，TEXT 存大文本且放在行外，ENUM 固定选项；默认字符集 utf8mb4，中文可以直接存。\n数值：INT 整数，DECIMAL 精确小数，FLOAT\u002FDOUBLE 近似小数。\n日期时间：DATE、DATETIME、TIMESTAMP。\n外键：FOREIGN KEY ... REFERENCES ...，保证引用完整性。\n约束可以命名，便于维护。\n",[30,2473,2471],{"__ignoreMap":97},[13,2475,2476],{},"本章重点：",[238,2478,2479,2485,2488,2491],{},[241,2480,2481,2482,1433],{},"会写 ",[30,2483,2484],{},"CREATE TABLE",[241,2486,2487],{},"会根据业务选择合适的数据类型。",[241,2489,2490],{},"会定义主键、非空、外键。",[241,2492,2493],{},"理解复合主键和外键引用的作用。",[2495,2496,2497],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":97,"searchDepth":147,"depth":147,"links":2499},[2500,2501,2506,2512,2513],{"id":24,"depth":122,"text":25},{"id":84,"depth":122,"text":85,"children":2502},[2503,2504,2505],{"id":89,"depth":147,"text":90},{"id":538,"depth":147,"text":539},{"id":645,"depth":147,"text":646},{"id":820,"depth":122,"text":821,"children":2507},[2508,2509,2510,2511],{"id":824,"depth":147,"text":825},{"id":1339,"depth":147,"text":1340},{"id":1704,"depth":147,"text":1705},{"id":1859,"depth":147,"text":1860},{"id":2114,"depth":122,"text":2115},{"id":2466,"depth":122,"text":2467},"学习",null,"MySQL 学习笔记第六篇：CREATE TABLE 的完整语法、常用数据类型的选型建议，以及外键的两种定义方式。","md",false,{},"\u002Fposts\u002Fmysql\u002Fmysql-learning-06",{"title":5,"description":2516},"SQL 学习笔记","posts\u002Fmysql\u002Fmysql-learning-06",[2525,2526,2527],"SQL","MySQL","学习笔记","nNplWHtOhCWxsAwt17Eotjk0U0IbGmoRj0XPzzanaSw",[2530,2537,2543,2549,2555,2561,2567,2573,2579,2584,2589,2594,2599,2604,2609,2614,2619,2624,2629,2634,2639,2644,2649,2654,2659,2664,2669,2674,2679,2685,2689,2693,2697,2701,2705,2709,2713,2717,2721,2725,2729,2735,2739,2743,2747,2748,2752,2756,2760,2764,2768,2773,2777,2781,2786,2791,2797,2801,2806,2810],{"path":2531,"title":2532,"description":2533,"date":2534,"series":2535,"seriesOrder":2536},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-28","软件分析与设计笔记 28：draw.io 作图手册：五张图的符号位置、落笔顺序与自检","不模拟软件界面，只讲清三件事：每个 UML 符号在 draw.io 里搜什么词、一张图该按什么顺序落笔、画完拿什么标准自查。覆盖用例图、活动图、顺序图、类图、界面草图五种图纸，末尾附「最容易画反的十二笔」总检表。","2026-11-19","软件分析与设计笔记",28,{"path":2538,"title":2539,"description":2540,"date":2541,"series":2535,"seriesOrder":2542},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-27","软件分析与设计笔记 27：Paper 1 应试：从读案例到交卷的一次完整演算","拿一份完整的案例，从头到尾走一遍：怎么读案例列角色、怎么在四个小问之间分配时间、每一张图从哪一句话推出来、两张表怎么填、交卷前拿什么清单自查。附 C25 真题与样卷的题型分值对照。","2026-11-18",27,{"path":2544,"title":2545,"description":2546,"date":2547,"series":2535,"seriesOrder":2548},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-26","软件分析与设计笔记 26：总结：把整条链路串起来","系列收尾：从需求到代码的完整链路回顾、每一环的产出与验收方式、六条贯穿全系列的原则，以及一份可以直接拿去做项目自查的清单。","2026-11-17",26,{"path":2550,"title":2551,"description":2552,"date":2553,"series":2535,"seriesOrder":2554},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-25","软件分析与设计笔记 25：代码重构：坏味道与手法","重构不改变外部行为、只改善内部结构：四种常见坏味道与对应手法、为什么动手之前必须先有测试、什么时候该重构，以及重构和前面那些设计模型是什么关系。","2026-11-16",25,{"path":2556,"title":2557,"description":2558,"date":2559,"series":2535,"seriesOrder":2560},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-24","软件分析与设计笔记 24：设计原则：内聚、耦合与多态","好设计怎么衡量：内聚与耦合分别在说什么、一次从「差设计」到「多态重设计」的完整对照、抽象类与接口的选择依据，以及复用为什么会从优势变成风险。","2026-11-15",24,{"path":2562,"title":2563,"description":2564,"date":2565,"series":2535,"seriesOrder":2566},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-23","软件分析与设计笔记 23：设计建模：从对象模型到能实现的方案","分析模型能用但还不能直接开工：对象模型怎么映射到关系模型、继承映射的三种方案怎么选、数据访问层与 Data Broker 解决什么问题，以及三层架构与 MVC 的分工。","2026-11-14",23,{"path":2568,"title":2569,"description":2570,"date":2571,"series":2535,"seriesOrder":2572},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-22","软件分析与设计笔记 22：分析建模：边界、实体与控制对象","不经过分析直接写代码会踩什么坑、三种分析对象各管一段、怎么用顺序图完成一次用例实现，以及从顺序图导出类的属性、操作与关系的方法。","2026-11-13",22,{"path":2574,"title":2575,"description":2576,"date":2577,"series":2535,"seriesOrder":2578},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-21","软件分析与设计笔记 21：UML：类图与顺序图","为什么需要一种共同的画法：类符号三格怎么画、五种关系的符号与设计含义、每种关系落到 Java 是什么写法，顺序图的三要素怎么摆；以及这三种最容易找不到的符号在 draw.io 里各搜什么词。","2026-11-12",21,{"path":2580,"title":2581,"description":2582,"date":2583,"series":2535,"seriesOrder":530},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-20","软件分析与设计笔记 20：面向对象概念：对象、关系与多态","面向对象不是「用某个语言写代码」：对象与类的区别、封装真正在保护什么、五种关系（依赖、关联、聚合、组合、继承）各自何时用，以及多态为什么能减少条件判断。","2026-11-11",{"path":2585,"title":2586,"description":2587,"date":2588,"series":2535,"seriesOrder":525},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-19","软件分析与设计笔记 19：规范化与逻辑数据模型","一次改地址引发的数据不一致，讲清规范化的真正动机；UNF 到 3NF 每一步在解决什么问题，派生字段为什么不能存，优化为什么和规范化方向相反，以及逻辑数据模型在 3NF 之上补了什么。","2026-11-10",{"path":2590,"title":2591,"description":2592,"date":2593,"series":2535,"seriesOrder":500},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-18","软件分析与设计笔记 18：数据库分析：实体、关系与数据字典","为什么不能拿到需求就动手建表：实体与关系怎么判定、基数为什么必须由业务方确认、数据命名要遵守什么规则，以及数据字典四列里最容易被空着的那一列。","2026-11-09",{"path":2595,"title":2596,"description":2597,"date":2598,"series":2535,"seriesOrder":495},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-17","软件分析与设计笔记 17：用生成式 AI 做设计与开发：能用的场景与要防的坑","生成式 AI 在工作流里真正站得住的三个场景 —— 造示例数据、解释陌生代码、起草初稿；它为什么会复现社会偏见、为什么会编得像真的，以及哪些内容绝不能直接采用。","2026-11-08",{"path":2600,"title":2601,"description":2602,"date":2603,"series":2535,"seriesOrder":486},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-16","软件分析与设计笔记 16：从 persona 到 URS：一份交付物的完整骨架","把前面十几篇串成一份能交出去的东西：用户需求规格说明书的九个部分、每一章来自哪个环节、由谁确认，以及面向决策者的提案该讲清哪三件事。","2026-11-07",{"path":2605,"title":2606,"description":2607,"date":2608,"series":2535,"seriesOrder":479},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-15","软件分析与设计笔记 15：非功能需求：把「快、稳、安全」变成数字","为什么「系统要快」不是一条需求：非功能需求怎么量化，决定性能的用户量、交易量、数据量三张表怎么估，安全需求要写清什么，以及可靠性的「不可用」该怎么定义。","2026-11-06",{"path":2610,"title":2611,"description":2612,"date":2613,"series":2535,"seriesOrder":474},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-14","软件分析与设计笔记 14：软件测试：层级、方法与等价类划分","「我们测过了」这句话问题在哪：为什么静态评审和动态测试缺一不可，五个测试层级各自验证什么，白盒与黑盒的差别，以及用等价类划分和边界值把无限输入变成有限用例的方法。","2026-11-05",{"path":2615,"title":2616,"description":2617,"date":2618,"series":2535,"seriesOrder":468},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-13","软件分析与设计笔记 13：需求获取：五种调查方法与一场访谈","需求从哪里来：五种事实调查方法各自适合回答什么、代价是什么，访谈从准备到记录的全过程，问卷设计里最容易犯的错，以及访谈记录必须写下来的那几项信息。","2026-11-04",{"path":2620,"title":2621,"description":2622,"date":2623,"series":2535,"seriesOrder":463},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-12","软件分析与设计笔记 12：前端设计：把流程变成屏幕","界面设计不是「画得好看」：从活动图走到屏幕的三步，CRUD 任务流怎么当检查表，界面必须回答的三个问题，信息架构与五种导航类型，视觉一致性与留白，以及移动端与 Web 端的差别。","2026-11-03",{"path":2625,"title":2626,"description":2627,"date":2628,"series":2535,"seriesOrder":438},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-11","软件分析与设计笔记 11：Agentic AI 与业务流程自动化","AI agent 到底是什么：五项能力与四个核心组件，什么场景该用定时任务、什么该用程序、什么才值得用 agent，两种实现路径的差别，必须提前防住的四类失败模式，以及设计方法从提示词到编排的演进。","2026-11-02",{"path":2630,"title":2631,"description":2632,"date":2633,"series":2535,"seriesOrder":433},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-10","软件分析与设计笔记 10：精炼用例模型：include、extend 与泛化","三种精炼用例关系的判断标准：include 什么时候用、它和 extend 的区别到底在哪、参与者泛化与用例泛化各解决什么问题，以及精炼到什么程度就该停手。","2026-11-01",{"path":2635,"title":2636,"description":2637,"date":2638,"series":2535,"seriesOrder":423},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-09","软件分析与设计笔记 09：功能需求（二）：从流程到业务实体","活动图画完之后，怎么从流程里筛出真正的业务实体：三条判断标准、哪些名词其实不该建实体、属性从哪里来，以及领域模型和后面的数据模型分别负责什么。","2026-10-31",{"path":2640,"title":2641,"description":2642,"date":2643,"series":2535,"seriesOrder":230},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-08","软件分析与设计笔记 08：功能需求（一）：用例模型与活动图","从用户故事到用例的翻译过程：什么才算「好」的参与者，系统边界怎么划，用例描述必须写清哪四件事，活动图怎么把分支、并行与泳道画清楚，以及这两个图在 draw.io 里各用哪个形状、最容易画错哪一笔。","2026-10-30",{"path":2645,"title":2646,"description":2647,"date":2648,"series":2535,"seriesOrder":221},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-07","软件分析与设计笔记 07：用户故事：把需求写成可验收的一句话","用户故事的三段结构，怎么从用户画像和数据地图里把它提取出来，一条故事多大算合适、时序为什么也是需求的一部分，以及验收标准怎么写才算真的可验收。","2026-10-29",{"path":2650,"title":2651,"description":2652,"date":2653,"series":2535,"seriesOrder":202},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-06","软件分析与设计笔记 06：范围界定（数据侧）：用数据校验你的判断","访谈结论和数字对不上时该怎么办：分析的四个层次分别在回答什么问题、为什么不能跳级、数据准备与搜集怎么做成一张应用地图，以及数据最容易在哪几个地方骗你。","2026-10-28",{"path":2655,"title":2656,"description":2657,"date":2658,"series":2535,"seriesOrder":186},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-05","软件分析与设计笔记 05：范围界定（用户侧）：用户画像与客户旅程图","为什么「所有用户」是一个陷阱，项目边界该怎么划，用户画像要写哪五个要素、最容易写成什么废纸，客户旅程图怎么把阶段、想法和情绪画在同一张纸上，以及怎么从这两样东西一步步推到可验证的需求。","2026-10-27",{"path":2660,"title":2661,"description":2662,"date":2663,"series":2535,"seriesOrder":166},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-04","软件分析与设计笔记 04：接手陌生案例的第一步：三问与一张表","拿到一个完全陌生的业务案例，怎么从零开始不跑偏：只问 Who、What、Why 三个问题，把「问题—事实—假设—理由」记成一张四列表，说清为什么假设必须写明理由，以及带着问题进访谈为什么比空手去有效得多。","2026-10-26",{"path":2665,"title":2666,"description":2667,"date":2668,"series":2535,"seriesOrder":147},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-03","软件分析与设计笔记 03：Agile 与 Scrum：迭代、角色与产出物","从「三周做完交付，客户说这不是我要的」讲起，说清瀑布式与迭代式的根本差别，Scrum 的三个角色和三种产出物，一个 sprint 里四次固定活动各自在解决什么问题，以及敏捷里最常见的几个误解。","2026-10-25",{"path":2670,"title":2671,"description":2672,"date":2673,"series":2535,"seriesOrder":122},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-02","软件分析与设计笔记 02：设计思维、用户驱动与数据驱动","从「客服要一个能一次看完所有排期的界面」这个翻车案例讲起，说清设计思维到底是什么、用户驱动与数据驱动各自能看见什么又看不见什么、为什么真正的落点是把两者合起来的 data-informed design，以及访谈中怎么问出有用的信息。","2026-10-24",{"path":2675,"title":2676,"description":2677,"date":2678,"series":2535,"seriesOrder":104},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-01","软件分析与设计笔记 01：课程地图与从需求到设计的主干","这一篇不写具体方法，先把整条链路铺开：软件分析与设计到底要解决什么问题，从需求到设计分成哪两段，中间有哪十几个环节，一份完整的交付物里应该有什么，以及后面 27 篇笔记怎么排、新人该按什么顺序读。","2026-10-23",{"path":2680,"title":2681,"description":2682,"date":2683,"series":2684,"seriesOrder":104},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-01","Spring 学习笔记 01：IoC、依赖注入与第一个 Spring Boot 应用","从「手写 new 出来的三层结构」的痛点讲起，说清 IoC 容器、Bean 与依赖注入是怎么回事，再用 Maven 与 Spring Initializr 跑起第一个能返回 JSON 的应用。","2026-10-15","Spring 学习笔记",{"path":2686,"title":2687,"description":2688,"date":2683,"series":2684,"seriesOrder":122},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-02","Spring 学习笔记 02：Spring Data JPA 基础——实体映射与 Repository","用 ORM 把类映射到表：@Entity、@Id、@GeneratedValue 怎么用，CrudRepository 三层接口怎么选，H2 与 MySQL 怎么配，以及 ddl-auto 到底该写哪个值。",{"path":2690,"title":2691,"description":2692,"date":2683,"series":2684,"seriesOrder":147},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-03","Spring 学习笔记 03：JPA 查询——派生方法、JPQL 与分页排序","Repository 自带的方法只够按主键查，这篇讲三种自己造查询的方式：方法名派生、@Query 写 JPQL、原生 SQL，以及 Pageable 分页排序和投影返回。",{"path":2694,"title":2695,"description":2696,"date":2683,"series":2684,"seriesOrder":166},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-04","Spring 学习笔记 04：JPA 关联映射与仓储测试","一对多、多对多怎么映射，谁负责维护外键，FetchType 与 CascadeType 该怎么选，顺带用 @DataJpaTest 与 AssertJ 把仓储层测起来。",{"path":2698,"title":2699,"description":2700,"date":2683,"series":2684,"seriesOrder":186},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-05","Spring 学习笔记 05：Spring MVC 与 Thymeleaf 入门","一次页面请求在 Spring MVC 里走了哪几步，@Controller 怎么把数据交给模板，@PathVariable 与 @RequestParam 怎么取参数，以及控制器为什么必须是无状态的。",{"path":2702,"title":2703,"description":2704,"date":2683,"series":2684,"seriesOrder":202},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-06","Spring 学习笔记 06：表单绑定与服务端校验","把表单字段绑到对象上，用 Bean Validation 注解做服务端校验，把错误信息显示回用户刚填的那一页，再补上自定义校验注解与全局异常处理。",{"path":2706,"title":2707,"description":2708,"date":2683,"series":2684,"seriesOrder":221},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-07","Spring 学习笔记 07：Thymeleaf 片段复用与国际化","用 th:fragment 与 th:insert\u002Fth:replace 把导航栏、页脚抽成片段，页面套用统一布局，再用 messages.properties 与 LocaleResolver 做中英文切换。",{"path":2710,"title":2711,"description":2712,"date":2683,"series":2684,"seriesOrder":230},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-08","Spring 学习笔记 08：HTTP Session 与会话状态管理","HTTP 无状态带来的问题，Cookie 与 Session 怎么分工，Spring 里读写会话的几种方式，以及会话固定、超时、多实例共享这些必须想清楚的事。",{"path":2714,"title":2715,"description":2716,"date":2683,"series":2684,"seriesOrder":423},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-09","Spring 学习笔记 09：拦截器 HandlerInterceptor","登录检查、权限判断、请求耗时统计这类横切逻辑该放哪：HandlerInterceptor 的三个回调各在什么时机执行，怎么注册与排除路径，以及它和过滤器的分工。",{"path":2718,"title":2719,"description":2720,"date":2683,"series":2684,"seriesOrder":433},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-10","Spring 学习笔记 10：Service 层与事务","一组数据库操作要么全成功要么全失败，靠 @Transactional 怎么做到；传播行为、隔离级别、回滚规则怎么选，以及自调用失效、乐观锁悲观锁这些实战里的坑。",{"path":2722,"title":2723,"description":2724,"date":2683,"series":2684,"seriesOrder":438},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-11","Spring 学习笔记 11：REST API 基础——把 Service 暴露成接口","同一套 Service 怎么同时服务页面和客户端：@RestController 的路由与方法语义、状态码怎么给、DTO 怎么定，以及 MockMvc 端到端和切片测试的两种写法与各自的坑。",{"path":2726,"title":2727,"description":2728,"date":2683,"series":2684,"seriesOrder":463},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-12","Spring 学习笔记 12：REST 进阶——版本、更新、跨域与文档化","接口能跑通之后要处理的几件事：URL 与响应结构怎么定、版本怎么演进、更新怎么做到可安全重试、CORS 怎么配、HATEOAS 与 Spring Data REST 该不该用。",{"path":2730,"title":2731,"description":2732,"date":2733,"series":2734,"seriesOrder":166},"\u002Fposts\u002Fjava\u002Fjava-functionalprogramming-notes","Java 函数式编程笔记：Lambda、函数式接口与 Streams","学习 Java 函数式编程时的个人笔记：Lambda 表达式的五步简写与方法引用、常见函数式接口、Stream 流水线与惰性求值，以及创建流、中间操作、终止操作与收集器的用法。示例代码均为自写，运行结果来自本地实测。","2026-10-13","Java 学习笔记",{"path":2736,"title":2737,"description":2738,"date":2733,"series":2734,"seriesOrder":147},"\u002Fposts\u002Fjava\u002Fjava-generics-notes","Java 泛型笔记：泛型方法、有界类型与泛型类","学习 Java 泛型时的个人笔记：从重复的重载方法与多态尝试讲起，再到泛型方法与类型推断、有界泛型类型、Comparable 与 Number 边界，以及泛型类在集合中的用法。示例代码均为自写，运行结果来自本地实测。",{"path":2740,"title":2741,"description":2742,"date":1784,"series":2522,"seriesOrder":166},"\u002Fposts\u002Fmysql\u002Fmysql-learning-04","MySQL 学习笔记 04：数据操纵（增删改）","MySQL 学习笔记第四篇：INSERT 插入（含批量插入与 INSERT ... SELECT）、UPDATE 更新、DELETE 删除，以及各自的坑。",{"path":2744,"title":2745,"description":2746,"date":1784,"series":2522,"seriesOrder":186},"\u002Fposts\u002Fmysql\u002Fmysql-learning-05","MySQL 学习笔记 05：DDL 概览","MySQL 学习笔记第五篇：数据定义语言概览——Schema、Table、View、Index、Constraints 这几类对象分别对应哪些 CREATE \u002F ALTER \u002F DROP 命令。",{"path":2520,"title":5,"description":2516,"date":1784,"series":2522,"seriesOrder":202},{"path":2749,"title":2750,"description":2751,"date":1784,"series":2522,"seriesOrder":221},"\u002Fposts\u002Fmysql\u002Fmysql-learning-07","MySQL 学习笔记 07：索引","MySQL 学习笔记第七篇：索引的作用与 B+ 树结构、单列与复合索引的创建、索引的代价与适用场景。",{"path":2753,"title":2754,"description":2755,"date":1784,"series":2522,"seriesOrder":230},"\u002Fposts\u002Fmysql\u002Fmysql-learning-08","MySQL 学习笔记 08：DROP 与 ALTER","MySQL 学习笔记第八篇：DROP 删除数据库对象、ALTER 修改表结构，以及常见的坑。",{"path":2757,"title":2758,"description":2759,"date":1784,"series":2522,"seriesOrder":423},"\u002Fposts\u002Fmysql\u002Fmysql-learning-09","MySQL 学习笔记 09：约束与数据完整性","MySQL 学习笔记第九篇：SQL 约束——NOT NULL、CHECK、PRIMARY KEY、FOREIGN KEY 等如何保证数据完整性，以及它们的对比。",{"path":2761,"title":2762,"description":2763,"date":1784,"series":2522,"seriesOrder":433},"\u002Fposts\u002Fmysql\u002Fmysql-learning-10","MySQL 学习笔记 10：视图","MySQL 学习笔记第十篇：视图（Views）的定义与特性、和表的对比、创建与使用，以及可更新视图的限制。",{"path":2765,"title":2766,"description":2767,"date":1784,"series":2522,"seriesOrder":438},"\u002Fposts\u002Fmysql\u002Fmysql-learning-11","MySQL 学习笔记 11：存储过程","MySQL 学习笔记第十一篇：存储过程（Stored Procedures）的概念、创建与调用、带参数的写法，以及优缺点。",{"path":2769,"title":2770,"description":2771,"date":2772,"series":2522,"seriesOrder":104},"\u002Fposts\u002Fmysql\u002Fmysql-learning-01","MySQL 学习笔记 01：MySQL 基础知识","MySQL 学习笔记第一篇：MySQL Server 与 Workbench 的安装，数据库与 DBMS 的基本概念，关系模型、ACID 事务、常见数据类型，以及后续的学习路线。","2026-10-09",{"path":2774,"title":2775,"description":2776,"date":2772,"series":2522,"seriesOrder":122},"\u002Fposts\u002Fmysql\u002Fmysql-learning-02","MySQL 学习笔记 02：SELECT 查询与过滤","MySQL 学习笔记第二篇：SELECT 的基本语法与逻辑执行顺序，WHERE 过滤（比较、LIKE、IN、BETWEEN、NULL）、各种 JOIN、UNION 与子查询。",{"path":2778,"title":2779,"description":2780,"date":2772,"series":2522,"seriesOrder":147},"\u002Fposts\u002Fmysql\u002Fmysql-learning-03","MySQL 学习笔记 03：聚合、分组与输出控制","MySQL 学习笔记第三篇：COUNT\u002FSUM\u002FAVG 等聚合函数、GROUP BY 分组、HAVING 过滤、ORDER BY 与 LIMIT，以及一条 SELECT 的完整逻辑执行顺序。",{"path":2782,"title":2783,"description":2784,"date":2785,"series":2734,"seriesOrder":122},"\u002Fposts\u002Fjava\u002Fjava-oop-notes","Java 面向对象笔记：类、继承、多态与异常","学习 Java 面向对象编程时的个人笔记：类与对象、封装与访问修饰符、继承与多态、集合、抽象类与接口、异常处理。示例代码均为自写，运行结果来自本地实测。","2026-10-06",{"path":2787,"title":2788,"description":2789,"date":2790,"series":2734,"seriesOrder":104},"\u002Fposts\u002Fjava\u002Fjava-basics-notes","Java 基础语法笔记：从环境安装到方法与数组","学习 Java 基础语法时的个人笔记：JDK 安装、输入输出、变量与运算符、条件与循环、字符串、数组与方法。示例代码均为自写，运行结果来自本地实测。","2026-10-05",{"path":2792,"title":2793,"description":2794,"date":2795,"series":2796,"seriesOrder":104},"\u002Fposts\u002Fgit\u002Fgit-install-and-basics","Git 安装与基本使用","从装好 Git 到跑通日常提交流程，把最常用的几条命令和它们背后的三个区域讲清楚。","2026-10-04","Git 入门",{"path":2798,"title":2799,"description":2800,"date":2795,"series":2796,"seriesOrder":122},"\u002Fposts\u002Fgit\u002Flocal-remote-repository","本地远程仓库的部署","用自己的机器当 Git 服务器：建一个裸仓库、走 SSH 连上去，把本地提交推上去。",{"path":2802,"title":2803,"description":2804,"date":2795,"series":2805,"seriesOrder":104},"\u002Fposts\u002Fguide\u002Fguide-file-layout","文件都放在哪","文章、图片、封面分别放在仓库的什么位置，哪些目录可以放手改、哪些碰了会出问题。","博客使用指南",{"path":2807,"title":2808,"description":2809,"date":2795,"series":2805,"seriesOrder":122},"\u002Fposts\u002Fguide\u002Fguide-frontmatter","frontmatter 每个字段是什么意思","文章开头那段被横线包住的字段，逐个说明作用、默认行为和写错的后果。",{"path":2811,"title":2812,"description":2813,"date":2795,"series":2805,"seriesOrder":147},"\u002Fposts\u002Fguide\u002Fguide-markdown","正文怎么写 —— Markdown 与排版效果","标题、链接、图片、代码、表格分别怎么写，以及本站对它们做了哪些自定义处理。",1793268186193]