[{"data":1,"prerenderedAt":3930},["ShallowReactive",2],{"post:\u002Fposts\u002Fmysql\u002Fmysql-learning-04":3,"posts:ordered":3642},{"id":4,"title":5,"body":6,"category":3626,"cover":3627,"date":3628,"description":3629,"extension":3630,"featured":3631,"meta":3632,"navigation":1116,"path":3633,"seo":3634,"series":3635,"seriesOrder":529,"stem":3636,"tags":3637,"__hash__":3641},"posts\u002Fposts\u002Fmysql\u002Fmysql-learning-04.md","MySQL 学习笔记 04：数据操纵（增删改）",{"type":7,"value":8,"toc":3587},"minimark",[9,16,21,26,31,143,147,150,213,216,243,246,250,256,259,290,293,311,313,317,356,359,373,376,384,386,390,442,444,450,452,474,477,533,536,598,601,609,611,615,732,734,740,742,750,752,756,830,832,841,847,849,871,873,877,923,925,937,991,996,1049,1051,1055,1058,1061,1227,1230,1340,1342,1350,1352,1356,1361,1363,1399,1401,1405,1435,1437,1443,1445,1465,1468,1541,1543,1547,1587,1589,1595,1597,1614,1616,1620,1679,1681,1687,1689,1699,1701,1705,1751,1753,1763,1765,1769,1837,1839,1845,1847,1871,1873,1877,1880,1973,1975,1983,1985,2067,2069,2073,2144,2146,2154,2156,2160,2264,2266,2277,2279,2283,2289,2291,2310,2312,2316,2335,2337,2343,2345,2363,2365,2402,2404,2408,2439,2441,2447,2449,2462,2464,2468,2522,2524,2530,2532,2548,2621,2623,2627,2630,2686,2688,2699,2701,2755,2757,2761,2798,2801,2893,2895,2910,2912,2916,2921,2959,2962,2986,2989,3022,3024,3032,3034,3038,3042,3198,3200,3206,3208,3212,3263,3265,3271,3273,3277,3370,3372,3378,3380,3384,3441,3443,3457,3459,3463,3574,3577,3583],[10,11,12],"blockquote",{},[13,14,15],"p",{},"本文是《SQL 学习笔记》系列的一篇：示例数据和 SQL 都是我整理并在 MySQL 8 上跑过的，讲解部分按自己的理解写的。",[17,18,20],"h1",{"id":19},"_7-数据操纵insertupdatedelete","7 数据操纵：INSERT、UPDATE、DELETE",[22,23,25],"h2",{"id":24},"_70-示例数据","7.0 示例数据",[27,28,30],"h3",{"id":29},"customers-表","Customers 表",[32,33,34,56],"table",{},[35,36,37],"thead",{},[38,39,40,44,47,50,53],"tr",{},[41,42,43],"th",{},"CustomerID",[41,45,46],{},"CustomerName",[41,48,49],{},"Address",[41,51,52],{},"Phone",[41,54,55],{},"MemberCategory",[57,58,59,77,94,111,127],"tbody",{},[38,60,61,65,68,71,74],{},[62,63,64],"td",{},"C001",[62,66,67],{},"Alice",[62,69,70],{},"Maple Ave",[62,72,73],{},"11111111",[62,75,76],{},"Gold",[38,78,79,82,85,88,91],{},[62,80,81],{},"C002",[62,83,84],{},"Bob",[62,86,87],{},"Birch St",[62,89,90],{},"22222222",[62,92,93],{},"Silver",[38,95,96,99,102,105,108],{},[62,97,98],{},"C003",[62,100,101],{},"Chen",[62,103,104],{},"Maple Street",[62,106,107],{},"33333333",[62,109,110],{},"Bronze",[38,112,113,116,119,122,125],{},[62,114,115],{},"C004",[62,117,118],{},"David",[62,120,121],{},"Marina",[62,123,124],{},"44444444",[62,126,76],{},[38,128,129,132,135,138,141],{},[62,130,131],{},"C005",[62,133,134],{},"Emily Chen",[62,136,137],{},"Chinatown",[62,139,140],{},"55555555",[62,142,93],{},[27,144,146],{"id":145},"prestigecustomers-表","PrestigeCustomers 表",[13,148,149],{},"初始数据：",[32,151,152,167],{},[35,153,154],{},[38,155,156,158,161,163,165],{},[41,157,43],{},[41,159,160],{},"Name",[41,162,49],{},[41,164,52],{},[41,166,55],{},[57,168,169,183,198],{},[38,170,171,174,176,178,181],{},[62,172,173],{},"C9000",[62,175,134],{},[62,177,104],{},[62,179,180],{},"NULL",[62,182,93],{},[38,184,185,188,191,193,196],{},[62,186,187],{},"C9001",[62,189,190],{},"Tom",[62,192,70],{},[62,194,195],{},"12345678",[62,197,110],{},[38,199,200,203,206,208,211],{},[62,201,202],{},"C9002",[62,204,205],{},"Anna",[62,207,87],{},[62,209,210],{},"87654321",[62,212,76],{},[13,214,215],{},"说明：",[217,218,219,231,240],"ul",{},[220,221,222,226,227,230],"li",{},[223,224,225],"code",{},"PrestigeCustomers"," 是“优质客户表”，可能从 ",[223,228,229],{},"Customers"," 中筛选插入。",[220,232,233,235,236,239],{},[223,234,52],{}," 允许为 NULL；如果实际表要求 ",[223,237,238],{},"NOT NULL","，插入时必须提供值。",[220,241,242],{},"下面所有例子都基于这两张表。",[244,245],"hr",{},[22,247,249],{"id":248},"_71-insert","7.1 INSERT",[13,251,252,255],{},[223,253,254],{},"INSERT"," 用于向表中插入新行。",[13,257,258],{},"基本语法：",[260,261,266],"pre",{"className":262,"code":263,"language":264,"meta":265,"style":265},"language-sql shiki shiki-themes github-light github-dark","INSERT INTO 表名 (列1, 列2, ...)\nVALUES (值1, 值2, ...);\n","sql","",[223,267,268,281],{"__ignoreMap":265},[269,270,273,277],"span",{"class":271,"line":272},"line",1,[269,274,276],{"class":275},"szBVR","INSERT INTO",[269,278,280],{"class":279},"sVt8B"," 表名 (列1, 列2, ...)\n",[269,282,284,287],{"class":271,"line":283},2,[269,285,286],{"class":275},"VALUES",[269,288,289],{"class":279}," (值1, 值2, ...);\n",[13,291,292],{},"或者：",[260,294,296],{"className":262,"code":295,"language":264,"meta":265,"style":265},"INSERT INTO 表名\nVALUES (值1, 值2, ...);\n",[223,297,298,305],{"__ignoreMap":265},[269,299,300,302],{"class":271,"line":272},[269,301,276],{"class":275},[269,303,304],{"class":279}," 表名\n",[269,306,307,309],{"class":271,"line":283},[269,308,286],{"class":275},[269,310,289],{"class":279},[244,312],{},[27,314,316],{"id":315},"_711-单行插入无列名","7.1.1 单行插入（无列名）",[260,318,320],{"className":262,"code":319,"language":264,"meta":265,"style":265},"-- 按表中列的定义顺序，提供所有列的值\nINSERT INTO PublisherWebsite\nVALUES ('Tim', 'www.timvideocompany.com');\n",[223,321,322,328,335],{"__ignoreMap":265},[269,323,324],{"class":271,"line":272},[269,325,327],{"class":326},"sJ8bj","-- 按表中列的定义顺序，提供所有列的值\n",[269,329,330,332],{"class":271,"line":283},[269,331,276],{"class":275},[269,333,334],{"class":279}," PublisherWebsite\n",[269,336,338,340,343,347,350,353],{"class":271,"line":337},3,[269,339,286],{"class":275},[269,341,342],{"class":279}," (",[269,344,346],{"class":345},"sZZnC","'Tim'",[269,348,349],{"class":279},", ",[269,351,352],{"class":345},"'www.timvideocompany.com'",[269,354,355],{"class":279},");\n",[13,357,358],{},"注释：",[217,360,361,367,370],{},[220,362,363,364,366],{},"不写列名时，",[223,365,286],{}," 中的值必须和表中列的顺序、数量、类型一一对应。",[220,368,369],{},"如果表结构后续增加列，这种写法容易出错。",[220,371,372],{},"生产环境更推荐写列名。",[13,374,375],{},"执行效果：",[260,377,382],{"className":378,"code":380,"language":381,"meta":265},[379],"language-text","PublisherWebsite 表新增一行：\nTim | www.timvideocompany.com\n","text",[223,383,380],{"__ignoreMap":265},[244,385],{},[27,387,389],{"id":388},"_712-单行插入有列名","7.1.2 单行插入（有列名）",[260,391,393],{"className":262,"code":392,"language":264,"meta":265,"style":265},"-- 指定列名，只插入这些列\nINSERT INTO PrestigeCustomers (CustomerID, Name, Address, MemberCategory)\nVALUES ('C9000', 'Emily Chen', 'Maple Street', 'Silver');\n",[223,394,395,400,416],{"__ignoreMap":265},[269,396,397],{"class":271,"line":272},[269,398,399],{"class":326},"-- 指定列名，只插入这些列\n",[269,401,402,404,407,409,411,413],{"class":271,"line":283},[269,403,276],{"class":275},[269,405,406],{"class":279}," PrestigeCustomers (CustomerID, ",[269,408,160],{"class":275},[269,410,349],{"class":279},[269,412,49],{"class":275},[269,414,415],{"class":279},", MemberCategory)\n",[269,417,418,420,422,425,427,430,432,435,437,440],{"class":271,"line":337},[269,419,286],{"class":275},[269,421,342],{"class":279},[269,423,424],{"class":345},"'C9000'",[269,426,349],{"class":279},[269,428,429],{"class":345},"'Emily Chen'",[269,431,349],{"class":279},[269,433,434],{"class":345},"'Maple Street'",[269,436,349],{"class":279},[269,438,439],{"class":345},"'Silver'",[269,441,355],{"class":279},[13,443,375],{},[260,445,448],{"className":446,"code":447,"language":381,"meta":265},[379],"PrestigeCustomers 新增一行：\nC9000 | Emily Chen | Maple Street | NULL | Silver\n",[223,449,447],{"__ignoreMap":265},[13,451,358],{},[217,453,454,460,466],{},[220,455,456,457,459],{},"未指定的列 ",[223,458,52],{}," 会使用默认值。",[220,461,462,463,465],{},"如果 ",[223,464,52],{}," 没有默认值且允许 NULL，则插入 NULL。",[220,467,462,468,470,471,473],{},[223,469,52],{}," 是 ",[223,472,238],{}," 且没有默认值，则插入失败。",[13,475,476],{},"错误示例：",[260,478,480],{"className":262,"code":479,"language":264,"meta":265,"style":265},"-- 假设 Phone 和 Email 都是 NOT NULL 且无默认值\nINSERT INTO PrestigeCustomers (CustomerID, Name, Address, MemberCategory)\nVALUES ('C9001', 'Tom', 'Maple Ave', 'Bronze');\n-- 会失败：Phone、Email 没有提供值\n",[223,481,482,487,501,527],{"__ignoreMap":265},[269,483,484],{"class":271,"line":272},[269,485,486],{"class":326},"-- 假设 Phone 和 Email 都是 NOT NULL 且无默认值\n",[269,488,489,491,493,495,497,499],{"class":271,"line":283},[269,490,276],{"class":275},[269,492,406],{"class":279},[269,494,160],{"class":275},[269,496,349],{"class":279},[269,498,49],{"class":275},[269,500,415],{"class":279},[269,502,503,505,507,510,512,515,517,520,522,525],{"class":271,"line":337},[269,504,286],{"class":275},[269,506,342],{"class":279},[269,508,509],{"class":345},"'C9001'",[269,511,349],{"class":279},[269,513,514],{"class":345},"'Tom'",[269,516,349],{"class":279},[269,518,519],{"class":345},"'Maple Ave'",[269,521,349],{"class":279},[269,523,524],{"class":345},"'Bronze'",[269,526,355],{"class":279},[269,528,530],{"class":271,"line":529},4,[269,531,532],{"class":326},"-- 会失败：Phone、Email 没有提供值\n",[13,534,535],{},"修正：",[260,537,539],{"className":262,"code":538,"language":264,"meta":265,"style":265},"INSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, Phone, Email, MemberCategory)\nVALUES\n('C9001', 'Tom', 'Maple Ave', '12345678', 'tom@example.com', 'Bronze');\n",[223,540,541,548,562,567],{"__ignoreMap":265},[269,542,543,545],{"class":271,"line":272},[269,544,276],{"class":275},[269,546,547],{"class":279}," PrestigeCustomers\n",[269,549,550,553,555,557,559],{"class":271,"line":283},[269,551,552],{"class":279},"(CustomerID, ",[269,554,160],{"class":275},[269,556,349],{"class":279},[269,558,49],{"class":275},[269,560,561],{"class":279},", Phone, Email, MemberCategory)\n",[269,563,564],{"class":271,"line":337},[269,565,566],{"class":275},"VALUES\n",[269,568,569,572,574,576,578,580,582,584,587,589,592,594,596],{"class":271,"line":529},[269,570,571],{"class":279},"(",[269,573,509],{"class":345},[269,575,349],{"class":279},[269,577,514],{"class":345},[269,579,349],{"class":279},[269,581,519],{"class":345},[269,583,349],{"class":279},[269,585,586],{"class":345},"'12345678'",[269,588,349],{"class":279},[269,590,591],{"class":345},"'tom@example.com'",[269,593,349],{"class":279},[269,595,524],{"class":345},[269,597,355],{"class":279},[13,599,600],{},"作用：",[217,602,603,606],{},[220,604,605],{},"指定列名更安全、更清晰。",[220,607,608],{},"可以只插入部分列，但必须满足非空约束和默认值规则。",[244,610],{},[27,612,614],{"id":613},"_713-多行插入","7.1.3 多行插入",[260,616,618],{"className":262,"code":617,"language":264,"meta":265,"style":265},"-- 一次插入多行，性能通常比多次单行插入更好\nINSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, Phone, MemberCategory)\nVALUES\n('C9001', 'Tom', 'Maple Ave', '12345678', 'Bronze'),\n('C9002', 'Anna', 'Birch St', '87654321', 'Gold'),\n('C9003', 'Mike', 'Marina', NULL, 'Silver');\n",[223,619,620,625,631,644,648,674,704],{"__ignoreMap":265},[269,621,622],{"class":271,"line":272},[269,623,624],{"class":326},"-- 一次插入多行，性能通常比多次单行插入更好\n",[269,626,627,629],{"class":271,"line":283},[269,628,276],{"class":275},[269,630,547],{"class":279},[269,632,633,635,637,639,641],{"class":271,"line":337},[269,634,552],{"class":279},[269,636,160],{"class":275},[269,638,349],{"class":279},[269,640,49],{"class":275},[269,642,643],{"class":279},", Phone, MemberCategory)\n",[269,645,646],{"class":271,"line":529},[269,647,566],{"class":275},[269,649,651,653,655,657,659,661,663,665,667,669,671],{"class":271,"line":650},5,[269,652,571],{"class":279},[269,654,509],{"class":345},[269,656,349],{"class":279},[269,658,514],{"class":345},[269,660,349],{"class":279},[269,662,519],{"class":345},[269,664,349],{"class":279},[269,666,586],{"class":345},[269,668,349],{"class":279},[269,670,524],{"class":345},[269,672,673],{"class":279},"),\n",[269,675,677,679,682,684,687,689,692,694,697,699,702],{"class":271,"line":676},6,[269,678,571],{"class":279},[269,680,681],{"class":345},"'C9002'",[269,683,349],{"class":279},[269,685,686],{"class":345},"'Anna'",[269,688,349],{"class":279},[269,690,691],{"class":345},"'Birch St'",[269,693,349],{"class":279},[269,695,696],{"class":345},"'87654321'",[269,698,349],{"class":279},[269,700,701],{"class":345},"'Gold'",[269,703,673],{"class":279},[269,705,707,709,712,714,717,719,722,724,726,728,730],{"class":271,"line":706},7,[269,708,571],{"class":279},[269,710,711],{"class":345},"'C9003'",[269,713,349],{"class":279},[269,715,716],{"class":345},"'Mike'",[269,718,349],{"class":279},[269,720,721],{"class":345},"'Marina'",[269,723,349],{"class":279},[269,725,180],{"class":275},[269,727,349],{"class":279},[269,729,439],{"class":345},[269,731,355],{"class":279},[13,733,375],{},[260,735,738],{"className":736,"code":737,"language":381,"meta":265},[379],"PrestigeCustomers 新增 3 行：\nC9001 | Tom  | Maple Ave | 12345678 | Bronze\nC9002 | Anna | Birch St   | 87654321 | Gold\nC9003 | Mike | Marina  | NULL     | Silver\n",[223,739,737],{"__ignoreMap":265},[13,741,358],{},[217,743,744,747],{},[220,745,746],{},"多行插入减少网络往返和 SQL 解析次数。",[220,748,749],{},"批量插入时，建议控制每批大小，例如 500～1000 行，避免事务过大。",[244,751],{},[27,753,755],{"id":754},"_714-使用查询插入","7.1.4 使用查询插入",[260,757,759],{"className":262,"code":758,"language":264,"meta":265,"style":265},"-- 从 Customers 查询数据，插入到 PrestigeCustomers\nINSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, Phone, MemberCategory)\nSELECT CustomerID, CustomerName, Address, Phone, MemberCategory\nFROM Customers\nWHERE MemberCategory IN ('Gold', 'Silver', 'Bronze');\n",[223,760,761,766,772,784,797,805],{"__ignoreMap":265},[269,762,763],{"class":271,"line":272},[269,764,765],{"class":326},"-- 从 Customers 查询数据，插入到 PrestigeCustomers\n",[269,767,768,770],{"class":271,"line":283},[269,769,276],{"class":275},[269,771,547],{"class":279},[269,773,774,776,778,780,782],{"class":271,"line":337},[269,775,552],{"class":279},[269,777,160],{"class":275},[269,779,349],{"class":279},[269,781,49],{"class":275},[269,783,643],{"class":279},[269,785,786,789,792,794],{"class":271,"line":529},[269,787,788],{"class":275},"SELECT",[269,790,791],{"class":279}," CustomerID, CustomerName, ",[269,793,49],{"class":275},[269,795,796],{"class":279},", Phone, MemberCategory\n",[269,798,799,802],{"class":271,"line":650},[269,800,801],{"class":275},"FROM",[269,803,804],{"class":279}," Customers\n",[269,806,807,810,813,816,818,820,822,824,826,828],{"class":271,"line":676},[269,808,809],{"class":275},"WHERE",[269,811,812],{"class":279}," MemberCategory ",[269,814,815],{"class":275},"IN",[269,817,342],{"class":279},[269,819,701],{"class":345},[269,821,349],{"class":279},[269,823,439],{"class":345},[269,825,349],{"class":279},[269,827,524],{"class":345},[269,829,355],{"class":279},[13,831,375],{},[13,833,834,835,837,838,840],{},"假设 ",[223,836,229],{}," 中 5 行都满足条件，则 ",[223,839,225],{}," 新增 5 行。",[260,842,845],{"className":843,"code":844,"language":381,"meta":265},[379],"C001 | Alice       | Maple Ave   | 11111111 | Gold\nC002 | Bob         | Birch St     | 22222222 | Silver\nC003 | Chen        | Maple Street | 33333333 | Bronze\nC004 | David       | Marina    | 44444444 | Gold\nC005 | Emily Chen | Chinatown | 55555555 | Silver\n",[223,846,844],{"__ignoreMap":265},[13,848,358],{},[217,850,851,857,862,868],{},[220,852,853,856],{},[223,854,855],{},"INSERT INTO ... SELECT"," 的列数、顺序、类型要匹配。",[220,858,859,861],{},[223,860,788],{}," 中列名不必和插入列名相同，但位置要对应。",[220,863,864,865,867],{},"可以用 ",[223,866,809],{}," 过滤要插入的数据。",[220,869,870],{},"如果目标表有唯一约束，重复插入可能失败。",[244,872],{},[27,874,876],{"id":875},"_715-insert-与默认值自增列","7.1.5 INSERT 与默认值、自增列",[260,878,880],{"className":262,"code":879,"language":264,"meta":265,"style":265},"-- 假设 Id 是自增列，可以省略\nINSERT INTO Customers (CustomerName, Address, Phone, MemberCategory)\nVALUES ('New Customer', 'New Address', '99999999', 'Bronze');\n",[223,881,882,887,898],{"__ignoreMap":265},[269,883,884],{"class":271,"line":272},[269,885,886],{"class":326},"-- 假设 Id 是自增列，可以省略\n",[269,888,889,891,894,896],{"class":271,"line":283},[269,890,276],{"class":275},[269,892,893],{"class":279}," Customers (CustomerName, ",[269,895,49],{"class":275},[269,897,643],{"class":279},[269,899,900,902,904,907,909,912,914,917,919,921],{"class":271,"line":337},[269,901,286],{"class":275},[269,903,342],{"class":279},[269,905,906],{"class":345},"'New Customer'",[269,908,349],{"class":279},[269,910,911],{"class":345},"'New Address'",[269,913,349],{"class":279},[269,915,916],{"class":345},"'99999999'",[269,918,349],{"class":279},[269,920,524],{"class":345},[269,922,355],{"class":279},[13,924,358],{},[217,926,927,930],{},[220,928,929],{},"自增列通常不需要手动插入。",[220,931,932,933,936],{},"可以使用 ",[223,934,935],{},"DEFAULT"," 显式使用默认值：",[260,938,940],{"className":262,"code":939,"language":264,"meta":265,"style":265},"INSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, Phone, MemberCategory)\nVALUES\n('C9010', 'Default Phone User', 'Somewhere', DEFAULT, 'Silver');\n",[223,941,942,948,960,964],{"__ignoreMap":265},[269,943,944,946],{"class":271,"line":272},[269,945,276],{"class":275},[269,947,547],{"class":279},[269,949,950,952,954,956,958],{"class":271,"line":283},[269,951,552],{"class":279},[269,953,160],{"class":275},[269,955,349],{"class":279},[269,957,49],{"class":275},[269,959,643],{"class":279},[269,961,962],{"class":271,"line":337},[269,963,566],{"class":275},[269,965,966,968,971,973,976,978,981,983,985,987,989],{"class":271,"line":529},[269,967,571],{"class":279},[269,969,970],{"class":345},"'C9010'",[269,972,349],{"class":279},[269,974,975],{"class":345},"'Default Phone User'",[269,977,349],{"class":279},[269,979,980],{"class":345},"'Somewhere'",[269,982,349],{"class":279},[269,984,935],{"class":275},[269,986,349],{"class":279},[269,988,439],{"class":345},[269,990,355],{"class":279},[217,992,993],{},[220,994,995],{},"如果列允许 NULL，也可以显式插入 NULL：",[260,997,999],{"className":262,"code":998,"language":264,"meta":265,"style":265},"INSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, Phone, MemberCategory)\nVALUES\n('C9011', 'Null Phone User', 'Somewhere', NULL, 'Silver');\n",[223,1000,1001,1007,1019,1023],{"__ignoreMap":265},[269,1002,1003,1005],{"class":271,"line":272},[269,1004,276],{"class":275},[269,1006,547],{"class":279},[269,1008,1009,1011,1013,1015,1017],{"class":271,"line":283},[269,1010,552],{"class":279},[269,1012,160],{"class":275},[269,1014,349],{"class":279},[269,1016,49],{"class":275},[269,1018,643],{"class":279},[269,1020,1021],{"class":271,"line":337},[269,1022,566],{"class":275},[269,1024,1025,1027,1030,1032,1035,1037,1039,1041,1043,1045,1047],{"class":271,"line":529},[269,1026,571],{"class":279},[269,1028,1029],{"class":345},"'C9011'",[269,1031,349],{"class":279},[269,1033,1034],{"class":345},"'Null Phone User'",[269,1036,349],{"class":279},[269,1038,980],{"class":345},[269,1040,349],{"class":279},[269,1042,180],{"class":275},[269,1044,349],{"class":279},[269,1046,439],{"class":345},[269,1048,355],{"class":279},[244,1050],{},[27,1052,1054],{"id":1053},"_716-插入冲突处理","7.1.6 插入冲突处理",[13,1056,1057],{},"如果表有主键或唯一索引，重复插入会报错。",[13,1059,1060],{},"MySQL 写法：",[260,1062,1064],{"className":262,"code":1063,"language":264,"meta":265,"style":265},"-- 遇到重复键则忽略\nINSERT IGNORE INTO PrestigeCustomers\n(CustomerID, Name, Address, MemberCategory)\nVALUES ('C9000', 'Emily Chen', 'Maple Street', 'Silver');\n\n-- 遇到重复键则更新\nINSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, MemberCategory)\nVALUES ('C9000', 'Emily Chen', 'Maple Street', 'Silver')\nON DUPLICATE KEY UPDATE\nName = VALUES(Name),\nAddress = VALUES(Address),\nMemberCategory = VALUES(MemberCategory);\n",[223,1065,1066,1071,1078,1090,1112,1118,1123,1129,1142,1166,1181,1198,1213],{"__ignoreMap":265},[269,1067,1068],{"class":271,"line":272},[269,1069,1070],{"class":326},"-- 遇到重复键则忽略\n",[269,1072,1073,1076],{"class":271,"line":283},[269,1074,1075],{"class":275},"INSERT IGNORE INTO",[269,1077,547],{"class":279},[269,1079,1080,1082,1084,1086,1088],{"class":271,"line":337},[269,1081,552],{"class":279},[269,1083,160],{"class":275},[269,1085,349],{"class":279},[269,1087,49],{"class":275},[269,1089,415],{"class":279},[269,1091,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110],{"class":271,"line":529},[269,1093,286],{"class":275},[269,1095,342],{"class":279},[269,1097,424],{"class":345},[269,1099,349],{"class":279},[269,1101,429],{"class":345},[269,1103,349],{"class":279},[269,1105,434],{"class":345},[269,1107,349],{"class":279},[269,1109,439],{"class":345},[269,1111,355],{"class":279},[269,1113,1114],{"class":271,"line":650},[269,1115,1117],{"emptyLinePlaceholder":1116},true,"\n",[269,1119,1120],{"class":271,"line":676},[269,1121,1122],{"class":326},"-- 遇到重复键则更新\n",[269,1124,1125,1127],{"class":271,"line":706},[269,1126,276],{"class":275},[269,1128,547],{"class":279},[269,1130,1132,1134,1136,1138,1140],{"class":271,"line":1131},8,[269,1133,552],{"class":279},[269,1135,160],{"class":275},[269,1137,349],{"class":279},[269,1139,49],{"class":275},[269,1141,415],{"class":279},[269,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163],{"class":271,"line":1144},9,[269,1146,286],{"class":275},[269,1148,342],{"class":279},[269,1150,424],{"class":345},[269,1152,349],{"class":279},[269,1154,429],{"class":345},[269,1156,349],{"class":279},[269,1158,434],{"class":345},[269,1160,349],{"class":279},[269,1162,439],{"class":345},[269,1164,1165],{"class":279},")\n",[269,1167,1169,1172,1175,1178],{"class":271,"line":1168},10,[269,1170,1171],{"class":275},"ON",[269,1173,1174],{"class":279}," DUPLICATE ",[269,1176,1177],{"class":275},"KEY",[269,1179,1180],{"class":275}," UPDATE\n",[269,1182,1184,1186,1189,1192,1194,1196],{"class":271,"line":1183},11,[269,1185,160],{"class":275},[269,1187,1188],{"class":275}," =",[269,1190,1191],{"class":275}," VALUES",[269,1193,571],{"class":279},[269,1195,160],{"class":275},[269,1197,673],{"class":279},[269,1199,1201,1203,1205,1207,1209,1211],{"class":271,"line":1200},12,[269,1202,49],{"class":275},[269,1204,1188],{"class":275},[269,1206,1191],{"class":275},[269,1208,571],{"class":279},[269,1210,49],{"class":275},[269,1212,673],{"class":279},[269,1214,1216,1219,1222,1224],{"class":271,"line":1215},13,[269,1217,1218],{"class":279},"MemberCategory ",[269,1220,1221],{"class":275},"=",[269,1223,1191],{"class":275},[269,1225,1226],{"class":279},"(MemberCategory);\n",[13,1228,1229],{},"PostgreSQL 写法：",[260,1231,1233],{"className":262,"code":1232,"language":264,"meta":265,"style":265},"INSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, MemberCategory)\nVALUES ('C9000', 'Emily Chen', 'Maple Street', 'Silver')\nON CONFLICT (CustomerID)\nDO UPDATE SET\nName = EXCLUDED.Name,\nAddress = EXCLUDED.Address,\nMemberCategory = EXCLUDED.MemberCategory;\n",[223,1234,1235,1241,1253,1275,1282,1293,1311,1325],{"__ignoreMap":265},[269,1236,1237,1239],{"class":271,"line":272},[269,1238,276],{"class":275},[269,1240,547],{"class":279},[269,1242,1243,1245,1247,1249,1251],{"class":271,"line":283},[269,1244,552],{"class":279},[269,1246,160],{"class":275},[269,1248,349],{"class":279},[269,1250,49],{"class":275},[269,1252,415],{"class":279},[269,1254,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273],{"class":271,"line":337},[269,1256,286],{"class":275},[269,1258,342],{"class":279},[269,1260,424],{"class":345},[269,1262,349],{"class":279},[269,1264,429],{"class":345},[269,1266,349],{"class":279},[269,1268,434],{"class":345},[269,1270,349],{"class":279},[269,1272,439],{"class":345},[269,1274,1165],{"class":279},[269,1276,1277,1279],{"class":271,"line":529},[269,1278,1171],{"class":275},[269,1280,1281],{"class":279}," CONFLICT (CustomerID)\n",[269,1283,1284,1287,1290],{"class":271,"line":650},[269,1285,1286],{"class":279},"DO ",[269,1288,1289],{"class":275},"UPDATE",[269,1291,1292],{"class":275}," SET\n",[269,1294,1295,1297,1299,1303,1306,1308],{"class":271,"line":676},[269,1296,160],{"class":275},[269,1298,1188],{"class":275},[269,1300,1302],{"class":1301},"sj4cs"," EXCLUDED",[269,1304,1305],{"class":279},".",[269,1307,160],{"class":1301},[269,1309,1310],{"class":279},",\n",[269,1312,1313,1315,1317,1319,1321,1323],{"class":271,"line":706},[269,1314,49],{"class":275},[269,1316,1188],{"class":275},[269,1318,1302],{"class":1301},[269,1320,1305],{"class":279},[269,1322,49],{"class":1301},[269,1324,1310],{"class":279},[269,1326,1327,1329,1331,1333,1335,1337],{"class":271,"line":1131},[269,1328,1218],{"class":279},[269,1330,1221],{"class":275},[269,1332,1302],{"class":1301},[269,1334,1305],{"class":279},[269,1336,55],{"class":1301},[269,1338,1339],{"class":279},";\n",[13,1341,600],{},[217,1343,1344,1347],{},[220,1345,1346],{},"避免重复插入报错。",[220,1348,1349],{},"可以实现“存在则更新，不存在则插入”的 UPSERT 效果。",[244,1351],{},[22,1353,1355],{"id":1354},"_72-update","7.2 UPDATE",[13,1357,1358,1360],{},[223,1359,1289],{}," 用于修改表中已有行。",[13,1362,258],{},[260,1364,1366],{"className":262,"code":1365,"language":264,"meta":265,"style":265},"UPDATE 表名\nSET 列1 = 值1, 列2 = 值2, ...\nWHERE 条件;\n",[223,1367,1368,1374,1392],{"__ignoreMap":265},[269,1369,1370,1372],{"class":271,"line":272},[269,1371,1289],{"class":275},[269,1373,304],{"class":279},[269,1375,1376,1379,1382,1384,1387,1389],{"class":271,"line":283},[269,1377,1378],{"class":275},"SET",[269,1380,1381],{"class":279}," 列1 ",[269,1383,1221],{"class":275},[269,1385,1386],{"class":279}," 值1, 列2 ",[269,1388,1221],{"class":275},[269,1390,1391],{"class":279}," 值2, ...\n",[269,1393,1394,1396],{"class":271,"line":337},[269,1395,809],{"class":275},[269,1397,1398],{"class":279}," 条件;\n",[244,1400],{},[27,1402,1404],{"id":1403},"_721-更新所有行","7.2.1 更新所有行",[260,1406,1408],{"className":262,"code":1407,"language":264,"meta":265,"style":265},"-- 把 PrestigeCustomers 中所有行的 Phone 都改成 7775588\nUPDATE PrestigeCustomers\nSET Phone = 7775588;\n",[223,1409,1410,1415,1421],{"__ignoreMap":265},[269,1411,1412],{"class":271,"line":272},[269,1413,1414],{"class":326},"-- 把 PrestigeCustomers 中所有行的 Phone 都改成 7775588\n",[269,1416,1417,1419],{"class":271,"line":283},[269,1418,1289],{"class":275},[269,1420,547],{"class":279},[269,1422,1423,1425,1428,1430,1433],{"class":271,"line":337},[269,1424,1378],{"class":275},[269,1426,1427],{"class":279}," Phone ",[269,1429,1221],{"class":275},[269,1431,1432],{"class":1301}," 7775588",[269,1434,1339],{"class":279},[13,1436,375],{},[260,1438,1441],{"className":1439,"code":1440,"language":381,"meta":265},[379],"PrestigeCustomers 所有行的 Phone 都变成 7775588。\n",[223,1442,1440],{"__ignoreMap":265},[13,1444,358],{},[217,1446,1447,1456,1459],{},[220,1448,1449,1450,1452,1453,1455],{},"没有 ",[223,1451,809],{}," 的 ",[223,1454,1289],{}," 会更新全表。",[220,1457,1458],{},"这是非常危险的操作，生产环境必须谨慎。",[220,1460,1461,1462,1464],{},"执行前建议先用 ",[223,1463,788],{}," 查看要影响的行。",[13,1466,1467],{},"安全习惯：",[260,1469,1471],{"className":262,"code":1470,"language":264,"meta":265,"style":265},"-- 先查询确认\nSELECT * FROM PrestigeCustomers WHERE Phone IS NULL;\n\n-- 再更新\nUPDATE PrestigeCustomers\nSET Phone = 7775588\nWHERE Phone IS NULL;\n",[223,1472,1473,1478,1503,1507,1512,1518,1529],{"__ignoreMap":265},[269,1474,1475],{"class":271,"line":272},[269,1476,1477],{"class":326},"-- 先查询确认\n",[269,1479,1480,1482,1485,1488,1491,1493,1495,1498,1501],{"class":271,"line":283},[269,1481,788],{"class":275},[269,1483,1484],{"class":275}," *",[269,1486,1487],{"class":275}," FROM",[269,1489,1490],{"class":279}," PrestigeCustomers ",[269,1492,809],{"class":275},[269,1494,1427],{"class":279},[269,1496,1497],{"class":275},"IS",[269,1499,1500],{"class":275}," NULL",[269,1502,1339],{"class":279},[269,1504,1505],{"class":271,"line":337},[269,1506,1117],{"emptyLinePlaceholder":1116},[269,1508,1509],{"class":271,"line":529},[269,1510,1511],{"class":326},"-- 再更新\n",[269,1513,1514,1516],{"class":271,"line":650},[269,1515,1289],{"class":275},[269,1517,547],{"class":279},[269,1519,1520,1522,1524,1526],{"class":271,"line":676},[269,1521,1378],{"class":275},[269,1523,1427],{"class":279},[269,1525,1221],{"class":275},[269,1527,1528],{"class":1301}," 7775588\n",[269,1530,1531,1533,1535,1537,1539],{"class":271,"line":706},[269,1532,809],{"class":275},[269,1534,1427],{"class":279},[269,1536,1497],{"class":275},[269,1538,1500],{"class":275},[269,1540,1339],{"class":279},[244,1542],{},[27,1544,1546],{"id":1545},"_722-选择性更新","7.2.2 选择性更新",[260,1548,1550],{"className":262,"code":1549,"language":264,"meta":265,"style":265},"-- 只更新 Name 为 Emily Chen 的行\nUPDATE PrestigeCustomers\nSET Phone = 7775588\nWHERE Name = 'Emily Chen';\n",[223,1551,1552,1557,1563,1573],{"__ignoreMap":265},[269,1553,1554],{"class":271,"line":272},[269,1555,1556],{"class":326},"-- 只更新 Name 为 Emily Chen 的行\n",[269,1558,1559,1561],{"class":271,"line":283},[269,1560,1289],{"class":275},[269,1562,547],{"class":279},[269,1564,1565,1567,1569,1571],{"class":271,"line":337},[269,1566,1378],{"class":275},[269,1568,1427],{"class":279},[269,1570,1221],{"class":275},[269,1572,1528],{"class":1301},[269,1574,1575,1577,1580,1582,1585],{"class":271,"line":529},[269,1576,809],{"class":275},[269,1578,1579],{"class":275}," Name",[269,1581,1188],{"class":275},[269,1583,1584],{"class":345}," 'Emily Chen'",[269,1586,1339],{"class":279},[13,1588,375],{},[260,1590,1593],{"className":1591,"code":1592,"language":381,"meta":265},[379],"只有 Emily Chen 的 Phone 变成 7775588。\n其他行不变。\n",[223,1594,1592],{"__ignoreMap":265},[13,1596,358],{},[217,1598,1599,1604,1609],{},[220,1600,1601,1603],{},[223,1602,809],{}," 是 UPDATE 的安全线。",[220,1605,462,1606,1608],{},[223,1607,809],{}," 条件匹配多行，就会更新多行。",[220,1610,462,1611,1613],{},[223,1612,809],{}," 没有匹配行，则影响 0 行。",[244,1615],{},[27,1617,1619],{"id":1618},"_723-同时更新多列","7.2.3 同时更新多列",[260,1621,1623],{"className":262,"code":1622,"language":264,"meta":265,"style":265},"UPDATE PrestigeCustomers\nSET Phone = 7775588,\n    Address = 'Maple Street',\n    MemberCategory = 'Gold'\nWHERE CustomerID = 'C9000';\n",[223,1624,1625,1631,1643,1655,1665],{"__ignoreMap":265},[269,1626,1627,1629],{"class":271,"line":272},[269,1628,1289],{"class":275},[269,1630,547],{"class":279},[269,1632,1633,1635,1637,1639,1641],{"class":271,"line":283},[269,1634,1378],{"class":275},[269,1636,1427],{"class":279},[269,1638,1221],{"class":275},[269,1640,1432],{"class":1301},[269,1642,1310],{"class":279},[269,1644,1645,1648,1650,1653],{"class":271,"line":337},[269,1646,1647],{"class":275},"    Address",[269,1649,1188],{"class":275},[269,1651,1652],{"class":345}," 'Maple Street'",[269,1654,1310],{"class":279},[269,1656,1657,1660,1662],{"class":271,"line":529},[269,1658,1659],{"class":279},"    MemberCategory ",[269,1661,1221],{"class":275},[269,1663,1664],{"class":345}," 'Gold'\n",[269,1666,1667,1669,1672,1674,1677],{"class":271,"line":650},[269,1668,809],{"class":275},[269,1670,1671],{"class":279}," CustomerID ",[269,1673,1221],{"class":275},[269,1675,1676],{"class":345}," 'C9000'",[269,1678,1339],{"class":279},[13,1680,375],{},[260,1682,1685],{"className":1683,"code":1684,"language":381,"meta":265},[379],"C9000 的 Phone、Address、MemberCategory 都被修改。\n",[223,1686,1684],{"__ignoreMap":265},[13,1688,358],{},[217,1690,1691,1696],{},[220,1692,1693,1695],{},[223,1694,1378],{}," 后多个赋值用逗号分隔。",[220,1697,1698],{},"可以更新为常量、表达式、函数、子查询结果。",[244,1700],{},[27,1702,1704],{"id":1703},"_724-使用表达式更新","7.2.4 使用表达式更新",[260,1706,1708],{"className":262,"code":1707,"language":264,"meta":265,"style":265},"-- 所有 Gold 客户年龄增加 1 岁\nUPDATE Customers\nSET Age = Age + 1\nWHERE MemberCategory = 'Gold';\n",[223,1709,1710,1715,1721,1738],{"__ignoreMap":265},[269,1711,1712],{"class":271,"line":272},[269,1713,1714],{"class":326},"-- 所有 Gold 客户年龄增加 1 岁\n",[269,1716,1717,1719],{"class":271,"line":283},[269,1718,1289],{"class":275},[269,1720,804],{"class":279},[269,1722,1723,1725,1728,1730,1732,1735],{"class":271,"line":337},[269,1724,1378],{"class":275},[269,1726,1727],{"class":279}," Age ",[269,1729,1221],{"class":275},[269,1731,1727],{"class":279},[269,1733,1734],{"class":275},"+",[269,1736,1737],{"class":1301}," 1\n",[269,1739,1740,1742,1744,1746,1749],{"class":271,"line":529},[269,1741,809],{"class":275},[269,1743,812],{"class":279},[269,1745,1221],{"class":275},[269,1747,1748],{"class":345}," 'Gold'",[269,1750,1339],{"class":279},[13,1752,358],{},[217,1754,1755,1760],{},[220,1756,1757,1759],{},[223,1758,1378],{}," 中可以使用原列值进行计算。",[220,1761,1762],{},"常用于计数、累加、状态变更。",[244,1764],{},[27,1766,1768],{"id":1767},"_725-带子查询更新","7.2.5 带子查询更新",[260,1770,1772],{"className":262,"code":1771,"language":264,"meta":265,"style":265},"-- 把 Bronze 客户的电话改成 7775588\nUPDATE PrestigeCustomers\nSET Phone = 7775588\nWHERE CustomerID IN (\n    SELECT CustomerID\n    FROM Customers\n    WHERE MemberCategory = 'Bronze'\n);\n",[223,1773,1774,1779,1785,1795,1806,1814,1821,1833],{"__ignoreMap":265},[269,1775,1776],{"class":271,"line":272},[269,1777,1778],{"class":326},"-- 把 Bronze 客户的电话改成 7775588\n",[269,1780,1781,1783],{"class":271,"line":283},[269,1782,1289],{"class":275},[269,1784,547],{"class":279},[269,1786,1787,1789,1791,1793],{"class":271,"line":337},[269,1788,1378],{"class":275},[269,1790,1427],{"class":279},[269,1792,1221],{"class":275},[269,1794,1528],{"class":1301},[269,1796,1797,1799,1801,1803],{"class":271,"line":529},[269,1798,809],{"class":275},[269,1800,1671],{"class":279},[269,1802,815],{"class":275},[269,1804,1805],{"class":279}," (\n",[269,1807,1808,1811],{"class":271,"line":650},[269,1809,1810],{"class":275},"    SELECT",[269,1812,1813],{"class":279}," CustomerID\n",[269,1815,1816,1819],{"class":271,"line":676},[269,1817,1818],{"class":275},"    FROM",[269,1820,804],{"class":279},[269,1822,1823,1826,1828,1830],{"class":271,"line":706},[269,1824,1825],{"class":275},"    WHERE",[269,1827,812],{"class":279},[269,1829,1221],{"class":275},[269,1831,1832],{"class":345}," 'Bronze'\n",[269,1834,1835],{"class":271,"line":1131},[269,1836,355],{"class":279},[13,1838,375],{},[260,1840,1843],{"className":1841,"code":1842,"language":381,"meta":265},[379],"PrestigeCustomers 中 CustomerID 属于 Bronze 客户的行，Phone 被更新。\n",[223,1844,1842],{"__ignoreMap":265},[13,1846,358],{},[217,1848,1849,1862,1865],{},[220,1850,1851,1852,1855,1856,1858,1859,1861],{},"原笔记中写的是 ",[223,1853,1854],{},"PhoneNumber = 7775588","，如果实际列名是 ",[223,1857,52],{},"，请改成 ",[223,1860,52],{},"。",[220,1863,1864],{},"子查询用于确定要更新哪些行。",[220,1866,1867,1868,1870],{},"注意子查询返回 NULL 时，",[223,1869,815],{}," 可能不匹配任何行。",[244,1872],{},[27,1874,1876],{"id":1875},"_726-update-join","7.2.6 UPDATE JOIN",[13,1878,1879],{},"MySQL 中可以使用 JOIN 更新：",[260,1881,1883],{"className":262,"code":1882,"language":264,"meta":265,"style":265},"UPDATE PrestigeCustomers P\nJOIN Customers C ON P.CustomerID = C.CustomerID\nSET P.MemberCategory = C.MemberCategory,\n    P.Phone = C.Phone\nWHERE C.MemberCategory = 'Gold';\n",[223,1884,1885,1892,1919,1939,1957],{"__ignoreMap":265},[269,1886,1887,1889],{"class":271,"line":272},[269,1888,1289],{"class":275},[269,1890,1891],{"class":279}," PrestigeCustomers P\n",[269,1893,1894,1897,1900,1902,1905,1907,1909,1911,1914,1916],{"class":271,"line":283},[269,1895,1896],{"class":275},"JOIN",[269,1898,1899],{"class":279}," Customers C ",[269,1901,1171],{"class":275},[269,1903,1904],{"class":1301}," P",[269,1906,1305],{"class":279},[269,1908,43],{"class":1301},[269,1910,1188],{"class":275},[269,1912,1913],{"class":1301}," C",[269,1915,1305],{"class":279},[269,1917,1918],{"class":1301},"CustomerID\n",[269,1920,1921,1923,1925,1927,1929,1931,1933,1935,1937],{"class":271,"line":337},[269,1922,1378],{"class":275},[269,1924,1904],{"class":1301},[269,1926,1305],{"class":279},[269,1928,55],{"class":1301},[269,1930,1188],{"class":275},[269,1932,1913],{"class":1301},[269,1934,1305],{"class":279},[269,1936,55],{"class":1301},[269,1938,1310],{"class":279},[269,1940,1941,1944,1946,1948,1950,1952,1954],{"class":271,"line":529},[269,1942,1943],{"class":1301},"    P",[269,1945,1305],{"class":279},[269,1947,52],{"class":1301},[269,1949,1188],{"class":275},[269,1951,1913],{"class":1301},[269,1953,1305],{"class":279},[269,1955,1956],{"class":1301},"Phone\n",[269,1958,1959,1961,1963,1965,1967,1969,1971],{"class":271,"line":650},[269,1960,809],{"class":275},[269,1962,1913],{"class":1301},[269,1964,1305],{"class":279},[269,1966,55],{"class":1301},[269,1968,1188],{"class":275},[269,1970,1748],{"class":345},[269,1972,1339],{"class":279},[13,1974,600],{},[217,1976,1977,1980],{},[220,1978,1979],{},"根据另一张表的数据更新当前表。",[220,1981,1982],{},"比子查询更直观，性能也可能更好。",[13,1984,1229],{},[260,1986,1988],{"className":262,"code":1987,"language":264,"meta":265,"style":265},"UPDATE PrestigeCustomers P\nSET MemberCategory = C.MemberCategory,\n    Phone = C.Phone\nFROM Customers C\nWHERE P.CustomerID = C.CustomerID\n  AND C.MemberCategory = 'Gold';\n",[223,1989,1990,1996,2012,2025,2032,2050],{"__ignoreMap":265},[269,1991,1992,1994],{"class":271,"line":272},[269,1993,1289],{"class":275},[269,1995,1891],{"class":279},[269,1997,1998,2000,2002,2004,2006,2008,2010],{"class":271,"line":283},[269,1999,1378],{"class":275},[269,2001,812],{"class":279},[269,2003,1221],{"class":275},[269,2005,1913],{"class":1301},[269,2007,1305],{"class":279},[269,2009,55],{"class":1301},[269,2011,1310],{"class":279},[269,2013,2014,2017,2019,2021,2023],{"class":271,"line":337},[269,2015,2016],{"class":279},"    Phone ",[269,2018,1221],{"class":275},[269,2020,1913],{"class":1301},[269,2022,1305],{"class":279},[269,2024,1956],{"class":1301},[269,2026,2027,2029],{"class":271,"line":529},[269,2028,801],{"class":275},[269,2030,2031],{"class":279}," Customers C\n",[269,2033,2034,2036,2038,2040,2042,2044,2046,2048],{"class":271,"line":650},[269,2035,809],{"class":275},[269,2037,1904],{"class":1301},[269,2039,1305],{"class":279},[269,2041,43],{"class":1301},[269,2043,1188],{"class":275},[269,2045,1913],{"class":1301},[269,2047,1305],{"class":279},[269,2049,1918],{"class":1301},[269,2051,2052,2055,2057,2059,2061,2063,2065],{"class":271,"line":676},[269,2053,2054],{"class":275},"  AND",[269,2056,1913],{"class":1301},[269,2058,1305],{"class":279},[269,2060,55],{"class":1301},[269,2062,1188],{"class":275},[269,2064,1748],{"class":345},[269,2066,1339],{"class":279},[244,2068],{},[27,2070,2072],{"id":2071},"_727-使用-case-条件更新","7.2.7 使用 CASE 条件更新",[260,2074,2076],{"className":262,"code":2075,"language":264,"meta":265,"style":265},"UPDATE PrestigeCustomers\nSET MemberCategory =\n    CASE\n        WHEN Phone IS NULL THEN 'Unknown'\n        WHEN Phone = 7775588 THEN 'Gold'\n        ELSE 'Silver'\n    END;\n",[223,2077,2078,2084,2093,2098,2115,2129,2137],{"__ignoreMap":265},[269,2079,2080,2082],{"class":271,"line":272},[269,2081,1289],{"class":275},[269,2083,547],{"class":279},[269,2085,2086,2088,2090],{"class":271,"line":283},[269,2087,1378],{"class":275},[269,2089,812],{"class":279},[269,2091,2092],{"class":275},"=\n",[269,2094,2095],{"class":271,"line":337},[269,2096,2097],{"class":275},"    CASE\n",[269,2099,2100,2103,2105,2107,2109,2112],{"class":271,"line":529},[269,2101,2102],{"class":275},"        WHEN",[269,2104,1427],{"class":279},[269,2106,1497],{"class":275},[269,2108,1500],{"class":275},[269,2110,2111],{"class":275}," THEN",[269,2113,2114],{"class":345}," 'Unknown'\n",[269,2116,2117,2119,2121,2123,2125,2127],{"class":271,"line":650},[269,2118,2102],{"class":275},[269,2120,1427],{"class":279},[269,2122,1221],{"class":275},[269,2124,1432],{"class":1301},[269,2126,2111],{"class":275},[269,2128,1664],{"class":345},[269,2130,2131,2134],{"class":271,"line":676},[269,2132,2133],{"class":275},"        ELSE",[269,2135,2136],{"class":345}," 'Silver'\n",[269,2138,2139,2142],{"class":271,"line":706},[269,2140,2141],{"class":275},"    END",[269,2143,1339],{"class":279},[13,2145,600],{},[217,2147,2148,2151],{},[220,2149,2150],{},"根据不同条件设置不同值。",[220,2152,2153],{},"适合批量分类、状态标记。",[244,2155],{},[27,2157,2159],{"id":2158},"_728-update-与事务","7.2.8 UPDATE 与事务",[260,2161,2163],{"className":262,"code":2162,"language":264,"meta":265,"style":265},"START TRANSACTION;\n\nUPDATE PrestigeCustomers\nSET Phone = 7775588\nWHERE Name = 'Emily Chen';\n\n-- 先查看结果\nSELECT * FROM PrestigeCustomers WHERE Name = 'Emily Chen';\n\n-- 如果不对，回滚\nROLLBACK;\n\n-- 如果正确，提交\n-- COMMIT;\n",[223,2164,2165,2172,2176,2182,2192,2204,2208,2213,2233,2237,2242,2249,2253,2258],{"__ignoreMap":265},[269,2166,2167,2170],{"class":271,"line":272},[269,2168,2169],{"class":275},"START TRANSACTION",[269,2171,1339],{"class":279},[269,2173,2174],{"class":271,"line":283},[269,2175,1117],{"emptyLinePlaceholder":1116},[269,2177,2178,2180],{"class":271,"line":337},[269,2179,1289],{"class":275},[269,2181,547],{"class":279},[269,2183,2184,2186,2188,2190],{"class":271,"line":529},[269,2185,1378],{"class":275},[269,2187,1427],{"class":279},[269,2189,1221],{"class":275},[269,2191,1528],{"class":1301},[269,2193,2194,2196,2198,2200,2202],{"class":271,"line":650},[269,2195,809],{"class":275},[269,2197,1579],{"class":275},[269,2199,1188],{"class":275},[269,2201,1584],{"class":345},[269,2203,1339],{"class":279},[269,2205,2206],{"class":271,"line":676},[269,2207,1117],{"emptyLinePlaceholder":1116},[269,2209,2210],{"class":271,"line":706},[269,2211,2212],{"class":326},"-- 先查看结果\n",[269,2214,2215,2217,2219,2221,2223,2225,2227,2229,2231],{"class":271,"line":1131},[269,2216,788],{"class":275},[269,2218,1484],{"class":275},[269,2220,1487],{"class":275},[269,2222,1490],{"class":279},[269,2224,809],{"class":275},[269,2226,1579],{"class":275},[269,2228,1188],{"class":275},[269,2230,1584],{"class":345},[269,2232,1339],{"class":279},[269,2234,2235],{"class":271,"line":1144},[269,2236,1117],{"emptyLinePlaceholder":1116},[269,2238,2239],{"class":271,"line":1168},[269,2240,2241],{"class":326},"-- 如果不对，回滚\n",[269,2243,2244,2247],{"class":271,"line":1183},[269,2245,2246],{"class":275},"ROLLBACK",[269,2248,1339],{"class":279},[269,2250,2251],{"class":271,"line":1200},[269,2252,1117],{"emptyLinePlaceholder":1116},[269,2254,2255],{"class":271,"line":1215},[269,2256,2257],{"class":326},"-- 如果正确，提交\n",[269,2259,2261],{"class":271,"line":2260},14,[269,2262,2263],{"class":326},"-- COMMIT;\n",[13,2265,358],{},[217,2267,2268,2271,2274],{},[220,2269,2270],{},"事务可以保证一组操作要么全部成功，要么全部失败。",[220,2272,2273],{},"更新前开启事务，出错时可以回滚。",[220,2275,2276],{},"不是所有数据库默认都支持事务，例如 MyISAM 不支持。",[244,2278],{},[22,2280,2282],{"id":2281},"_73-delete","7.3 DELETE",[13,2284,2285,2288],{},[223,2286,2287],{},"DELETE"," 用于删除表中已有行。",[13,2290,258],{},[260,2292,2294],{"className":262,"code":2293,"language":264,"meta":265,"style":265},"DELETE FROM 表名\nWHERE 条件;\n",[223,2295,2296,2304],{"__ignoreMap":265},[269,2297,2298,2300,2302],{"class":271,"line":272},[269,2299,2287],{"class":275},[269,2301,1487],{"class":275},[269,2303,304],{"class":279},[269,2305,2306,2308],{"class":271,"line":283},[269,2307,809],{"class":275},[269,2309,1398],{"class":279},[244,2311],{},[27,2313,2315],{"id":2314},"_731-删除所有行","7.3.1 删除所有行",[260,2317,2319],{"className":262,"code":2318,"language":264,"meta":265,"style":265},"-- 删除 PrestigeCustomers 所有行\nDELETE FROM PrestigeCustomers;\n",[223,2320,2321,2326],{"__ignoreMap":265},[269,2322,2323],{"class":271,"line":272},[269,2324,2325],{"class":326},"-- 删除 PrestigeCustomers 所有行\n",[269,2327,2328,2330,2332],{"class":271,"line":283},[269,2329,2287],{"class":275},[269,2331,1487],{"class":275},[269,2333,2334],{"class":279}," PrestigeCustomers;\n",[13,2336,375],{},[260,2338,2341],{"className":2339,"code":2340,"language":381,"meta":265},[379],"PrestigeCustomers 变成空表。\n表结构仍然存在。\n",[223,2342,2340],{"__ignoreMap":265},[13,2344,358],{},[217,2346,2347,2354,2357],{},[220,2348,1449,2349,1452,2351,2353],{},[223,2350,809],{},[223,2352,2287],{}," 会删除全表数据。",[220,2355,2356],{},"删除后表还在，只是没有数据。",[220,2358,2359,2360,2362],{},"在支持事务的数据库中，可以通过 ",[223,2361,2246],{}," 恢复。",[13,2364,1467],{},[260,2366,2368],{"className":262,"code":2367,"language":264,"meta":265,"style":265},"-- 先查询要删除的行\nSELECT * FROM PrestigeCustomers;\n\n-- 再删除\nDELETE FROM PrestigeCustomers;\n",[223,2369,2370,2375,2385,2389,2394],{"__ignoreMap":265},[269,2371,2372],{"class":271,"line":272},[269,2373,2374],{"class":326},"-- 先查询要删除的行\n",[269,2376,2377,2379,2381,2383],{"class":271,"line":283},[269,2378,788],{"class":275},[269,2380,1484],{"class":275},[269,2382,1487],{"class":275},[269,2384,2334],{"class":279},[269,2386,2387],{"class":271,"line":337},[269,2388,1117],{"emptyLinePlaceholder":1116},[269,2390,2391],{"class":271,"line":529},[269,2392,2393],{"class":326},"-- 再删除\n",[269,2395,2396,2398,2400],{"class":271,"line":650},[269,2397,2287],{"class":275},[269,2399,1487],{"class":275},[269,2401,2334],{"class":279},[244,2403],{},[27,2405,2407],{"id":2406},"_732-删除选中行","7.3.2 删除选中行",[260,2409,2411],{"className":262,"code":2410,"language":264,"meta":265,"style":265},"-- 只删除 Bronze 客户\nDELETE FROM PrestigeCustomers\nWHERE MemberCategory = 'Bronze';\n",[223,2412,2413,2418,2426],{"__ignoreMap":265},[269,2414,2415],{"class":271,"line":272},[269,2416,2417],{"class":326},"-- 只删除 Bronze 客户\n",[269,2419,2420,2422,2424],{"class":271,"line":283},[269,2421,2287],{"class":275},[269,2423,1487],{"class":275},[269,2425,547],{"class":279},[269,2427,2428,2430,2432,2434,2437],{"class":271,"line":337},[269,2429,809],{"class":275},[269,2431,812],{"class":279},[269,2433,1221],{"class":275},[269,2435,2436],{"class":345}," 'Bronze'",[269,2438,1339],{"class":279},[13,2440,375],{},[260,2442,2445],{"className":2443,"code":2444,"language":381,"meta":265},[379],"PrestigeCustomers 中 MemberCategory = 'Bronze' 的行被删除。\n其他行保留。\n",[223,2446,2444],{"__ignoreMap":265},[13,2448,358],{},[217,2450,2451,2456,2459],{},[220,2452,2453,2455],{},[223,2454,809],{}," 是 DELETE 的安全线。",[220,2457,2458],{},"如果条件匹配多行，会删除多行。",[220,2460,2461],{},"如果条件不匹配任何行，影响 0 行。",[244,2463],{},[27,2465,2467],{"id":2466},"_733-带子查询删除","7.3.3 带子查询删除",[260,2469,2471],{"className":262,"code":2470,"language":264,"meta":265,"style":265},"-- 删除属于 Gold 客户的 PrestigeCustomers 行\nDELETE FROM PrestigeCustomers\nWHERE CustomerID IN (\n    SELECT CustomerID\n    FROM Customers\n    WHERE MemberCategory = 'Gold'\n);\n",[223,2472,2473,2478,2486,2496,2502,2508,2518],{"__ignoreMap":265},[269,2474,2475],{"class":271,"line":272},[269,2476,2477],{"class":326},"-- 删除属于 Gold 客户的 PrestigeCustomers 行\n",[269,2479,2480,2482,2484],{"class":271,"line":283},[269,2481,2287],{"class":275},[269,2483,1487],{"class":275},[269,2485,547],{"class":279},[269,2487,2488,2490,2492,2494],{"class":271,"line":337},[269,2489,809],{"class":275},[269,2491,1671],{"class":279},[269,2493,815],{"class":275},[269,2495,1805],{"class":279},[269,2497,2498,2500],{"class":271,"line":529},[269,2499,1810],{"class":275},[269,2501,1813],{"class":279},[269,2503,2504,2506],{"class":271,"line":650},[269,2505,1818],{"class":275},[269,2507,804],{"class":279},[269,2509,2510,2512,2514,2516],{"class":271,"line":676},[269,2511,1825],{"class":275},[269,2513,812],{"class":279},[269,2515,1221],{"class":275},[269,2517,1664],{"class":345},[269,2519,2520],{"class":271,"line":706},[269,2521,355],{"class":279},[13,2523,375],{},[260,2525,2528],{"className":2526,"code":2527,"language":381,"meta":265},[379],"PrestigeCustomers 中 CustomerID 是 Gold 客户的行被删除。\n",[223,2529,2527],{"__ignoreMap":265},[13,2531,358],{},[217,2533,2534,2537,2542],{},[220,2535,2536],{},"子查询用于确定删除范围。",[220,2538,2539,2540,1870],{},"如果子查询返回 NULL，",[223,2541,815],{},[220,2543,2544,2545,2547],{},"在 MySQL 中，不能直接在 ",[223,2546,2287],{}," 的子查询中查询同一张表，需要派生表：",[260,2549,2551],{"className":262,"code":2550,"language":264,"meta":265,"style":265},"DELETE FROM PrestigeCustomers\nWHERE CustomerID IN (\n    SELECT CustomerID FROM (\n        SELECT CustomerID\n        FROM PrestigeCustomers\n        WHERE MemberCategory = 'Bronze'\n    ) AS T\n);\n",[223,2552,2553,2561,2571,2581,2588,2595,2606,2617],{"__ignoreMap":265},[269,2554,2555,2557,2559],{"class":271,"line":272},[269,2556,2287],{"class":275},[269,2558,1487],{"class":275},[269,2560,547],{"class":279},[269,2562,2563,2565,2567,2569],{"class":271,"line":283},[269,2564,809],{"class":275},[269,2566,1671],{"class":279},[269,2568,815],{"class":275},[269,2570,1805],{"class":279},[269,2572,2573,2575,2577,2579],{"class":271,"line":337},[269,2574,1810],{"class":275},[269,2576,1671],{"class":279},[269,2578,801],{"class":275},[269,2580,1805],{"class":279},[269,2582,2583,2586],{"class":271,"line":529},[269,2584,2585],{"class":275},"        SELECT",[269,2587,1813],{"class":279},[269,2589,2590,2593],{"class":271,"line":650},[269,2591,2592],{"class":275},"        FROM",[269,2594,547],{"class":279},[269,2596,2597,2600,2602,2604],{"class":271,"line":676},[269,2598,2599],{"class":275},"        WHERE",[269,2601,812],{"class":279},[269,2603,1221],{"class":275},[269,2605,1832],{"class":345},[269,2607,2608,2611,2614],{"class":271,"line":706},[269,2609,2610],{"class":279},"    ) ",[269,2612,2613],{"class":275},"AS",[269,2615,2616],{"class":279}," T\n",[269,2618,2619],{"class":271,"line":1131},[269,2620,355],{"class":279},[244,2622],{},[27,2624,2626],{"id":2625},"_734-delete-join","7.3.4 DELETE JOIN",[13,2628,2629],{},"MySQL 中可以使用 JOIN 删除：",[260,2631,2633],{"className":262,"code":2632,"language":264,"meta":265,"style":265},"DELETE P\nFROM PrestigeCustomers P\nJOIN Customers C ON P.CustomerID = C.CustomerID\nWHERE C.MemberCategory = 'Gold';\n",[223,2634,2635,2642,2648,2670],{"__ignoreMap":265},[269,2636,2637,2639],{"class":271,"line":272},[269,2638,2287],{"class":275},[269,2640,2641],{"class":279}," P\n",[269,2643,2644,2646],{"class":271,"line":283},[269,2645,801],{"class":275},[269,2647,1891],{"class":279},[269,2649,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668],{"class":271,"line":337},[269,2651,1896],{"class":275},[269,2653,1899],{"class":279},[269,2655,1171],{"class":275},[269,2657,1904],{"class":1301},[269,2659,1305],{"class":279},[269,2661,43],{"class":1301},[269,2663,1188],{"class":275},[269,2665,1913],{"class":1301},[269,2667,1305],{"class":279},[269,2669,1918],{"class":1301},[269,2671,2672,2674,2676,2678,2680,2682,2684],{"class":271,"line":529},[269,2673,809],{"class":275},[269,2675,1913],{"class":1301},[269,2677,1305],{"class":279},[269,2679,55],{"class":1301},[269,2681,1188],{"class":275},[269,2683,1748],{"class":345},[269,2685,1339],{"class":279},[13,2687,600],{},[217,2689,2690,2693],{},[220,2691,2692],{},"根据另一张表的条件删除当前表数据。",[220,2694,2695,2698],{},[223,2696,2697],{},"DELETE P"," 表示删除别名 P 对应的表。",[13,2700,1229],{},[260,2702,2704],{"className":262,"code":2703,"language":264,"meta":265,"style":265},"DELETE FROM PrestigeCustomers P\nUSING Customers C\nWHERE P.CustomerID = C.CustomerID\n  AND C.MemberCategory = 'Gold';\n",[223,2705,2706,2714,2721,2739],{"__ignoreMap":265},[269,2707,2708,2710,2712],{"class":271,"line":272},[269,2709,2287],{"class":275},[269,2711,1487],{"class":275},[269,2713,1891],{"class":279},[269,2715,2716,2719],{"class":271,"line":283},[269,2717,2718],{"class":275},"USING",[269,2720,2031],{"class":279},[269,2722,2723,2725,2727,2729,2731,2733,2735,2737],{"class":271,"line":337},[269,2724,809],{"class":275},[269,2726,1904],{"class":1301},[269,2728,1305],{"class":279},[269,2730,43],{"class":1301},[269,2732,1188],{"class":275},[269,2734,1913],{"class":1301},[269,2736,1305],{"class":279},[269,2738,1918],{"class":1301},[269,2740,2741,2743,2745,2747,2749,2751,2753],{"class":271,"line":529},[269,2742,2054],{"class":275},[269,2744,1913],{"class":1301},[269,2746,1305],{"class":279},[269,2748,55],{"class":1301},[269,2750,1188],{"class":275},[269,2752,1748],{"class":345},[269,2754,1339],{"class":279},[244,2756],{},[27,2758,2760],{"id":2759},"_735-delete-与-truncate-对比","7.3.5 DELETE 与 TRUNCATE 对比",[260,2762,2764],{"className":262,"code":2763,"language":264,"meta":265,"style":265},"-- 删除所有行，可以带 WHERE，可以回滚，速度较慢\nDELETE FROM PrestigeCustomers;\n\n-- 清空表，不能带 WHERE，通常不能回滚，速度较快\nTRUNCATE TABLE PrestigeCustomers;\n",[223,2765,2766,2771,2779,2783,2788],{"__ignoreMap":265},[269,2767,2768],{"class":271,"line":272},[269,2769,2770],{"class":326},"-- 删除所有行，可以带 WHERE，可以回滚，速度较慢\n",[269,2772,2773,2775,2777],{"class":271,"line":283},[269,2774,2287],{"class":275},[269,2776,1487],{"class":275},[269,2778,2334],{"class":279},[269,2780,2781],{"class":271,"line":337},[269,2782,1117],{"emptyLinePlaceholder":1116},[269,2784,2785],{"class":271,"line":529},[269,2786,2787],{"class":326},"-- 清空表，不能带 WHERE，通常不能回滚，速度较快\n",[269,2789,2790,2793,2796],{"class":271,"line":650},[269,2791,2792],{"class":275},"TRUNCATE",[269,2794,2795],{"class":275}," TABLE",[269,2797,2334],{"class":279},[13,2799,2800],{},"对比：",[32,2802,2803,2814],{},[35,2804,2805],{},[38,2806,2807,2810,2812],{},[41,2808,2809],{},"特性",[41,2811,2287],{},[41,2813,2792],{},[57,2815,2816,2827,2838,2849,2860,2871,2882],{},[38,2817,2818,2821,2824],{},[62,2819,2820],{},"是否可带 WHERE",[62,2822,2823],{},"可以",[62,2825,2826],{},"不可以",[38,2828,2829,2832,2835],{},[62,2830,2831],{},"删除范围",[62,2833,2834],{},"满足条件的行",[62,2836,2837],{},"全表",[38,2839,2840,2843,2846],{},[62,2841,2842],{},"是否记录逐行删除",[62,2844,2845],{},"是",[62,2847,2848],{},"通常否",[38,2850,2851,2854,2857],{},[62,2852,2853],{},"速度",[62,2855,2856],{},"较慢",[62,2858,2859],{},"较快",[38,2861,2862,2865,2868],{},[62,2863,2864],{},"是否可回滚",[62,2866,2867],{},"通常可以",[62,2869,2870],{},"通常不可以",[38,2872,2873,2876,2879],{},[62,2874,2875],{},"自增计数器",[62,2877,2878],{},"通常不重置",[62,2880,2881],{},"通常重置",[38,2883,2884,2887,2890],{},[62,2885,2886],{},"触发器",[62,2888,2889],{},"会触发",[62,2891,2892],{},"通常不触发",[13,2894,358],{},[217,2896,2897,2902,2907],{},[220,2898,2899,2900,1861],{},"需要删除部分数据用 ",[223,2901,2287],{},[220,2903,2904,2905,1861],{},"需要快速清空全表用 ",[223,2906,2792],{},[220,2908,2909],{},"生产环境清空表前必须确认备份和事务策略。",[244,2911],{},[27,2913,2915],{"id":2914},"_736-外键约束与删除","7.3.6 外键约束与删除",[13,2917,462,2918,2920],{},[223,2919,225],{}," 被其他表引用，删除可能失败。",[260,2922,2924],{"className":262,"code":2923,"language":264,"meta":265,"style":265},"-- 假设 Orders 表有外键引用 PrestigeCustomers\nDELETE FROM PrestigeCustomers WHERE CustomerID = 'C9000';\n-- 如果 Orders 中有对应订单，可能报错：\n-- Cannot delete or update a parent row: a foreign key constraint fails\n",[223,2925,2926,2931,2949,2954],{"__ignoreMap":265},[269,2927,2928],{"class":271,"line":272},[269,2929,2930],{"class":326},"-- 假设 Orders 表有外键引用 PrestigeCustomers\n",[269,2932,2933,2935,2937,2939,2941,2943,2945,2947],{"class":271,"line":283},[269,2934,2287],{"class":275},[269,2936,1487],{"class":275},[269,2938,1490],{"class":279},[269,2940,809],{"class":275},[269,2942,1671],{"class":279},[269,2944,1221],{"class":275},[269,2946,1676],{"class":345},[269,2948,1339],{"class":279},[269,2950,2951],{"class":271,"line":337},[269,2952,2953],{"class":326},"-- 如果 Orders 中有对应订单，可能报错：\n",[269,2955,2956],{"class":271,"line":529},[269,2957,2958],{"class":326},"-- Cannot delete or update a parent row: a foreign key constraint fails\n",[13,2960,2961],{},"外键行为：",[217,2963,2964,2974,2980],{},[220,2965,2966,2969,2970,2973],{},[223,2967,2968],{},"RESTRICT"," \u002F ",[223,2971,2972],{},"NO ACTION","：有引用时禁止删除。",[220,2975,2976,2979],{},[223,2977,2978],{},"CASCADE","：删除主表行时，自动删除子表相关行。",[220,2981,2982,2985],{},[223,2983,2984],{},"SET NULL","：删除主表行时，子表外键设为 NULL。",[13,2987,2988],{},"示例：",[260,2990,2992],{"className":262,"code":2991,"language":264,"meta":265,"style":265},"-- 建表时指定级联删除\nFOREIGN KEY (CustomerID)\nREFERENCES PrestigeCustomers(CustomerID)\nON DELETE CASCADE;\n",[223,2993,2994,2999,3007,3015],{"__ignoreMap":265},[269,2995,2996],{"class":271,"line":272},[269,2997,2998],{"class":326},"-- 建表时指定级联删除\n",[269,3000,3001,3004],{"class":271,"line":283},[269,3002,3003],{"class":275},"FOREIGN KEY",[269,3005,3006],{"class":279}," (CustomerID)\n",[269,3008,3009,3012],{"class":271,"line":337},[269,3010,3011],{"class":275},"REFERENCES",[269,3013,3014],{"class":279}," PrestigeCustomers(CustomerID)\n",[269,3016,3017,3020],{"class":271,"line":529},[269,3018,3019],{"class":275},"ON DELETE CASCADE",[269,3021,1339],{"class":279},[13,3023,358],{},[217,3025,3026,3029],{},[220,3027,3028],{},"级联删除很危险，可能误删大量数据。",[220,3030,3031],{},"删除前要了解外键约束。",[244,3033],{},[22,3035,3037],{"id":3036},"_74-综合示例","7.4 综合示例",[27,3039,3041],{"id":3040},"_741-插入更新删除完整流程","7.4.1 插入、更新、删除完整流程",[260,3043,3045],{"className":262,"code":3044,"language":264,"meta":265,"style":265},"-- 1. 插入新客户\nINSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, Phone, MemberCategory)\nVALUES\n('C9100', 'Emily Chen', 'Maple Street', NULL, 'Silver');\n\n-- 2. 更新电话\nUPDATE PrestigeCustomers\nSET Phone = 7775588\nWHERE CustomerID = 'C9100';\n\n-- 3. 查看\nSELECT * FROM PrestigeCustomers WHERE CustomerID = 'C9100';\n\n-- 4. 删除\nDELETE FROM PrestigeCustomers\nWHERE CustomerID = 'C9100';\n",[223,3046,3047,3052,3058,3070,3074,3099,3103,3108,3114,3124,3137,3141,3146,3166,3170,3176,3185],{"__ignoreMap":265},[269,3048,3049],{"class":271,"line":272},[269,3050,3051],{"class":326},"-- 1. 插入新客户\n",[269,3053,3054,3056],{"class":271,"line":283},[269,3055,276],{"class":275},[269,3057,547],{"class":279},[269,3059,3060,3062,3064,3066,3068],{"class":271,"line":337},[269,3061,552],{"class":279},[269,3063,160],{"class":275},[269,3065,349],{"class":279},[269,3067,49],{"class":275},[269,3069,643],{"class":279},[269,3071,3072],{"class":271,"line":529},[269,3073,566],{"class":275},[269,3075,3076,3078,3081,3083,3085,3087,3089,3091,3093,3095,3097],{"class":271,"line":650},[269,3077,571],{"class":279},[269,3079,3080],{"class":345},"'C9100'",[269,3082,349],{"class":279},[269,3084,429],{"class":345},[269,3086,349],{"class":279},[269,3088,434],{"class":345},[269,3090,349],{"class":279},[269,3092,180],{"class":275},[269,3094,349],{"class":279},[269,3096,439],{"class":345},[269,3098,355],{"class":279},[269,3100,3101],{"class":271,"line":676},[269,3102,1117],{"emptyLinePlaceholder":1116},[269,3104,3105],{"class":271,"line":706},[269,3106,3107],{"class":326},"-- 2. 更新电话\n",[269,3109,3110,3112],{"class":271,"line":1131},[269,3111,1289],{"class":275},[269,3113,547],{"class":279},[269,3115,3116,3118,3120,3122],{"class":271,"line":1144},[269,3117,1378],{"class":275},[269,3119,1427],{"class":279},[269,3121,1221],{"class":275},[269,3123,1528],{"class":1301},[269,3125,3126,3128,3130,3132,3135],{"class":271,"line":1168},[269,3127,809],{"class":275},[269,3129,1671],{"class":279},[269,3131,1221],{"class":275},[269,3133,3134],{"class":345}," 'C9100'",[269,3136,1339],{"class":279},[269,3138,3139],{"class":271,"line":1183},[269,3140,1117],{"emptyLinePlaceholder":1116},[269,3142,3143],{"class":271,"line":1200},[269,3144,3145],{"class":326},"-- 3. 查看\n",[269,3147,3148,3150,3152,3154,3156,3158,3160,3162,3164],{"class":271,"line":1215},[269,3149,788],{"class":275},[269,3151,1484],{"class":275},[269,3153,1487],{"class":275},[269,3155,1490],{"class":279},[269,3157,809],{"class":275},[269,3159,1671],{"class":279},[269,3161,1221],{"class":275},[269,3163,3134],{"class":345},[269,3165,1339],{"class":279},[269,3167,3168],{"class":271,"line":2260},[269,3169,1117],{"emptyLinePlaceholder":1116},[269,3171,3173],{"class":271,"line":3172},15,[269,3174,3175],{"class":326},"-- 4. 删除\n",[269,3177,3179,3181,3183],{"class":271,"line":3178},16,[269,3180,2287],{"class":275},[269,3182,1487],{"class":275},[269,3184,547],{"class":279},[269,3186,3188,3190,3192,3194,3196],{"class":271,"line":3187},17,[269,3189,809],{"class":275},[269,3191,1671],{"class":279},[269,3193,1221],{"class":275},[269,3195,3134],{"class":345},[269,3197,1339],{"class":279},[13,3199,375],{},[260,3201,3204],{"className":3202,"code":3203,"language":381,"meta":265},[379],"先新增 C9100；\n再把 C9100 的 Phone 改为 7775588；\n查询可以看到更新后的行；\n最后删除 C9100。\n",[223,3205,3203],{"__ignoreMap":265},[244,3207],{},[27,3209,3211],{"id":3210},"_742-从-customers-批量插入-gold-客户","7.4.2 从 Customers 批量插入 Gold 客户",[260,3213,3215],{"className":262,"code":3214,"language":264,"meta":265,"style":265},"INSERT INTO PrestigeCustomers\n(CustomerID, Name, Address, Phone, MemberCategory)\nSELECT CustomerID, CustomerName, Address, Phone, MemberCategory\nFROM Customers\nWHERE MemberCategory = 'Gold';\n",[223,3216,3217,3223,3235,3245,3251],{"__ignoreMap":265},[269,3218,3219,3221],{"class":271,"line":272},[269,3220,276],{"class":275},[269,3222,547],{"class":279},[269,3224,3225,3227,3229,3231,3233],{"class":271,"line":283},[269,3226,552],{"class":279},[269,3228,160],{"class":275},[269,3230,349],{"class":279},[269,3232,49],{"class":275},[269,3234,643],{"class":279},[269,3236,3237,3239,3241,3243],{"class":271,"line":337},[269,3238,788],{"class":275},[269,3240,791],{"class":279},[269,3242,49],{"class":275},[269,3244,796],{"class":279},[269,3246,3247,3249],{"class":271,"line":529},[269,3248,801],{"class":275},[269,3250,804],{"class":279},[269,3252,3253,3255,3257,3259,3261],{"class":271,"line":650},[269,3254,809],{"class":275},[269,3256,812],{"class":279},[269,3258,1221],{"class":275},[269,3260,1748],{"class":345},[269,3262,1339],{"class":279},[13,3264,375],{},[260,3266,3269],{"className":3267,"code":3268,"language":381,"meta":265},[379],"Customers 中所有 Gold 客户被复制到 PrestigeCustomers。\n",[223,3270,3268],{"__ignoreMap":265},[244,3272],{},[27,3274,3276],{"id":3275},"_743-根据-customers-更新-prestigecustomers","7.4.3 根据 Customers 更新 PrestigeCustomers",[260,3278,3280],{"className":262,"code":3279,"language":264,"meta":265,"style":265},"UPDATE PrestigeCustomers P\nJOIN Customers C ON P.CustomerID = C.CustomerID\nSET P.Phone = C.Phone,\n    P.MemberCategory = C.MemberCategory\nWHERE C.MemberCategory IN ('Gold', 'Silver');\n",[223,3281,3282,3288,3310,3330,3347],{"__ignoreMap":265},[269,3283,3284,3286],{"class":271,"line":272},[269,3285,1289],{"class":275},[269,3287,1891],{"class":279},[269,3289,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308],{"class":271,"line":283},[269,3291,1896],{"class":275},[269,3293,1899],{"class":279},[269,3295,1171],{"class":275},[269,3297,1904],{"class":1301},[269,3299,1305],{"class":279},[269,3301,43],{"class":1301},[269,3303,1188],{"class":275},[269,3305,1913],{"class":1301},[269,3307,1305],{"class":279},[269,3309,1918],{"class":1301},[269,3311,3312,3314,3316,3318,3320,3322,3324,3326,3328],{"class":271,"line":337},[269,3313,1378],{"class":275},[269,3315,1904],{"class":1301},[269,3317,1305],{"class":279},[269,3319,52],{"class":1301},[269,3321,1188],{"class":275},[269,3323,1913],{"class":1301},[269,3325,1305],{"class":279},[269,3327,52],{"class":1301},[269,3329,1310],{"class":279},[269,3331,3332,3334,3336,3338,3340,3342,3344],{"class":271,"line":529},[269,3333,1943],{"class":1301},[269,3335,1305],{"class":279},[269,3337,55],{"class":1301},[269,3339,1188],{"class":275},[269,3341,1913],{"class":1301},[269,3343,1305],{"class":279},[269,3345,3346],{"class":1301},"MemberCategory\n",[269,3348,3349,3351,3353,3355,3357,3360,3362,3364,3366,3368],{"class":271,"line":650},[269,3350,809],{"class":275},[269,3352,1913],{"class":1301},[269,3354,1305],{"class":279},[269,3356,55],{"class":1301},[269,3358,3359],{"class":275}," IN",[269,3361,342],{"class":279},[269,3363,701],{"class":345},[269,3365,349],{"class":279},[269,3367,439],{"class":345},[269,3369,355],{"class":279},[13,3371,375],{},[260,3373,3376],{"className":3374,"code":3375,"language":381,"meta":265},[379],"PrestigeCustomers 中匹配的客户，电话和会员类别被同步为 Customers 中的值。\n",[223,3377,3375],{"__ignoreMap":265},[244,3379],{},[27,3381,3383],{"id":3382},"_744-删除没有对应客户的-prestigecustomers","7.4.4 删除没有对应客户的 PrestigeCustomers",[260,3385,3387],{"className":262,"code":3386,"language":264,"meta":265,"style":265},"DELETE P\nFROM PrestigeCustomers P\nLEFT JOIN Customers C ON P.CustomerID = C.CustomerID\nWHERE C.CustomerID IS NULL;\n",[223,3388,3389,3395,3401,3424],{"__ignoreMap":265},[269,3390,3391,3393],{"class":271,"line":272},[269,3392,2287],{"class":275},[269,3394,2641],{"class":279},[269,3396,3397,3399],{"class":271,"line":283},[269,3398,801],{"class":275},[269,3400,1891],{"class":279},[269,3402,3403,3406,3408,3410,3412,3414,3416,3418,3420,3422],{"class":271,"line":337},[269,3404,3405],{"class":275},"LEFT JOIN",[269,3407,1899],{"class":279},[269,3409,1171],{"class":275},[269,3411,1904],{"class":1301},[269,3413,1305],{"class":279},[269,3415,43],{"class":1301},[269,3417,1188],{"class":275},[269,3419,1913],{"class":1301},[269,3421,1305],{"class":279},[269,3423,1918],{"class":1301},[269,3425,3426,3428,3430,3432,3434,3437,3439],{"class":271,"line":529},[269,3427,809],{"class":275},[269,3429,1913],{"class":1301},[269,3431,1305],{"class":279},[269,3433,43],{"class":1301},[269,3435,3436],{"class":275}," IS",[269,3438,1500],{"class":275},[269,3440,1339],{"class":279},[13,3442,600],{},[217,3444,3445,3454],{},[220,3446,3447,3448,3450,3451,3453],{},"找出 ",[223,3449,225],{}," 中在 ",[223,3452,229],{}," 里不存在的客户。",[220,3455,3456],{},"删除这些“孤立”记录。",[244,3458],{},[22,3460,3462],{"id":3461},"_75-常见坑总结","7.5 常见坑总结",[3464,3465,3466,3471,3477,3482,3485,3493,3500,3512,3523,3528,3536,3539,3553,3565,3568],"ol",{},[220,3467,3468,3470],{},[223,3469,254],{}," 不写列名时，必须按表定义顺序提供所有列的值。",[220,3472,3473,3474,3476],{},"省略非空且无默认值的列，",[223,3475,254],{}," 会失败。",[220,3478,3479,3481],{},[223,3480,855],{}," 的列数、顺序、类型必须匹配。",[220,3483,3484],{},"批量插入时，注意唯一约束冲突。",[220,3486,3487,3489,3490,3492],{},[223,3488,1289],{}," 不带 ",[223,3491,809],{}," 会更新全表，非常危险。",[220,3494,3495,3489,3497,3499],{},[223,3496,2287],{},[223,3498,809],{}," 会删除全表，非常危险。",[220,3501,3502,3503,3505,3506,3508,3509,3511],{},"执行 ",[223,3504,1289],{},"、",[223,3507,2287],{}," 前，先用 ",[223,3510,788],{}," 确认影响范围。",[220,3513,3514,3516,3517,3505,3519,3522],{},[223,3515,1289],{}," 的子查询如果返回多行，要使用 ",[223,3518,815],{},[223,3520,3521],{},"EXISTS"," 等正确处理。",[220,3524,3525,3527],{},[223,3526,2287],{}," 的子查询在 MySQL 中不能直接查同一张表，需要派生表。",[220,3529,3530,3532,3533,3535],{},[223,3531,2792],{}," 不能带 ",[223,3534,809],{},"，通常不能回滚，且可能重置自增。",[220,3537,3538],{},"外键约束可能导致删除失败，也可能级联删除。",[220,3540,3541,3542,3505,3544,3546,3547,3550,3551,1861],{},"事务中执行 ",[223,3543,1289],{},[223,3545,2287],{},"，确认后再 ",[223,3548,3549],{},"COMMIT","，出错可 ",[223,3552,2246],{},[220,3554,3555,3557,3558,3561,3562,1861],{},[223,3556,180],{}," 判断要用 ",[223,3559,3560],{},"IS NULL","，不要用 ",[223,3563,3564],{},"= NULL",[220,3566,3567],{},"更新或删除前最好备份，或至少开启事务。",[220,3569,3570,3571,3573],{},"生产环境避免全表更新、全表删除、无 ",[223,3572,809],{}," 操作。",[13,3575,3576],{},"核心记忆点：",[260,3578,3581],{"className":3579,"code":3580,"language":381,"meta":265},[379],"INSERT 插入新行，注意列顺序和非空约束；\nUPDATE 修改数据，WHERE 是安全线；\nDELETE 删除数据，WHERE 是安全线；\nTRUNCATE 快速清空全表，不能带 WHERE；\n事务可以保护 UPDATE、DELETE；\n先 SELECT 确认，再改删。\n",[223,3582,3580],{"__ignoreMap":265},[3584,3585,3586],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":265,"searchDepth":337,"depth":337,"links":3588},[3589,3593,3601,3611,3619,3625],{"id":24,"depth":283,"text":25,"children":3590},[3591,3592],{"id":29,"depth":337,"text":30},{"id":145,"depth":337,"text":146},{"id":248,"depth":283,"text":249,"children":3594},[3595,3596,3597,3598,3599,3600],{"id":315,"depth":337,"text":316},{"id":388,"depth":337,"text":389},{"id":613,"depth":337,"text":614},{"id":754,"depth":337,"text":755},{"id":875,"depth":337,"text":876},{"id":1053,"depth":337,"text":1054},{"id":1354,"depth":283,"text":1355,"children":3602},[3603,3604,3605,3606,3607,3608,3609,3610],{"id":1403,"depth":337,"text":1404},{"id":1545,"depth":337,"text":1546},{"id":1618,"depth":337,"text":1619},{"id":1703,"depth":337,"text":1704},{"id":1767,"depth":337,"text":1768},{"id":1875,"depth":337,"text":1876},{"id":2071,"depth":337,"text":2072},{"id":2158,"depth":337,"text":2159},{"id":2281,"depth":283,"text":2282,"children":3612},[3613,3614,3615,3616,3617,3618],{"id":2314,"depth":337,"text":2315},{"id":2406,"depth":337,"text":2407},{"id":2466,"depth":337,"text":2467},{"id":2625,"depth":337,"text":2626},{"id":2759,"depth":337,"text":2760},{"id":2914,"depth":337,"text":2915},{"id":3036,"depth":283,"text":3037,"children":3620},[3621,3622,3623,3624],{"id":3040,"depth":337,"text":3041},{"id":3210,"depth":337,"text":3211},{"id":3275,"depth":337,"text":3276},{"id":3382,"depth":337,"text":3383},{"id":3461,"depth":283,"text":3462},"学习",null,"2026-10-10","MySQL 学习笔记第四篇：INSERT 插入（含批量插入与 INSERT ... SELECT）、UPDATE 更新、DELETE 删除，以及各自的坑。","md",false,{},"\u002Fposts\u002Fmysql\u002Fmysql-learning-04",{"title":5,"description":3629},"SQL 学习笔记","posts\u002Fmysql\u002Fmysql-learning-04",[3638,3639,3640],"SQL","MySQL","学习笔记","K1ci56Hfha_F34RtADG_Ba8KcRe3oZ3uPsBu7x9l_UE",[3643,3650,3656,3662,3668,3674,3680,3686,3692,3698,3704,3710,3715,3720,3725,3730,3735,3740,3745,3750,3755,3760,3765,3770,3775,3780,3785,3790,3795,3801,3805,3809,3813,3817,3821,3825,3829,3833,3837,3841,3845,3851,3855,3856,3860,3864,3868,3872,3876,3880,3884,3889,3893,3897,3902,3907,3913,3917,3922,3926],{"path":3644,"title":3645,"description":3646,"date":3647,"series":3648,"seriesOrder":3649},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-28","软件分析与设计笔记 28：draw.io 作图手册：五张图的符号位置、落笔顺序与自检","不模拟软件界面，只讲清三件事：每个 UML 符号在 draw.io 里搜什么词、一张图该按什么顺序落笔、画完拿什么标准自查。覆盖用例图、活动图、顺序图、类图、界面草图五种图纸，末尾附「最容易画反的十二笔」总检表。","2026-11-19","软件分析与设计笔记",28,{"path":3651,"title":3652,"description":3653,"date":3654,"series":3648,"seriesOrder":3655},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-27","软件分析与设计笔记 27：Paper 1 应试：从读案例到交卷的一次完整演算","拿一份完整的案例，从头到尾走一遍：怎么读案例列角色、怎么在四个小问之间分配时间、每一张图从哪一句话推出来、两张表怎么填、交卷前拿什么清单自查。附 C25 真题与样卷的题型分值对照。","2026-11-18",27,{"path":3657,"title":3658,"description":3659,"date":3660,"series":3648,"seriesOrder":3661},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-26","软件分析与设计笔记 26：总结：把整条链路串起来","系列收尾：从需求到代码的完整链路回顾、每一环的产出与验收方式、六条贯穿全系列的原则，以及一份可以直接拿去做项目自查的清单。","2026-11-17",26,{"path":3663,"title":3664,"description":3665,"date":3666,"series":3648,"seriesOrder":3667},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-25","软件分析与设计笔记 25：代码重构：坏味道与手法","重构不改变外部行为、只改善内部结构：四种常见坏味道与对应手法、为什么动手之前必须先有测试、什么时候该重构，以及重构和前面那些设计模型是什么关系。","2026-11-16",25,{"path":3669,"title":3670,"description":3671,"date":3672,"series":3648,"seriesOrder":3673},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-24","软件分析与设计笔记 24：设计原则：内聚、耦合与多态","好设计怎么衡量：内聚与耦合分别在说什么、一次从「差设计」到「多态重设计」的完整对照、抽象类与接口的选择依据，以及复用为什么会从优势变成风险。","2026-11-15",24,{"path":3675,"title":3676,"description":3677,"date":3678,"series":3648,"seriesOrder":3679},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-23","软件分析与设计笔记 23：设计建模：从对象模型到能实现的方案","分析模型能用但还不能直接开工：对象模型怎么映射到关系模型、继承映射的三种方案怎么选、数据访问层与 Data Broker 解决什么问题，以及三层架构与 MVC 的分工。","2026-11-14",23,{"path":3681,"title":3682,"description":3683,"date":3684,"series":3648,"seriesOrder":3685},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-22","软件分析与设计笔记 22：分析建模：边界、实体与控制对象","不经过分析直接写代码会踩什么坑、三种分析对象各管一段、怎么用顺序图完成一次用例实现，以及从顺序图导出类的属性、操作与关系的方法。","2026-11-13",22,{"path":3687,"title":3688,"description":3689,"date":3690,"series":3648,"seriesOrder":3691},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-21","软件分析与设计笔记 21：UML：类图与顺序图","为什么需要一种共同的画法：类符号三格怎么画、五种关系的符号与设计含义、每种关系落到 Java 是什么写法，顺序图的三要素怎么摆；以及这三种最容易找不到的符号在 draw.io 里各搜什么词。","2026-11-12",21,{"path":3693,"title":3694,"description":3695,"date":3696,"series":3648,"seriesOrder":3697},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-20","软件分析与设计笔记 20：面向对象概念：对象、关系与多态","面向对象不是「用某个语言写代码」：对象与类的区别、封装真正在保护什么、五种关系（依赖、关联、聚合、组合、继承）各自何时用，以及多态为什么能减少条件判断。","2026-11-11",20,{"path":3699,"title":3700,"description":3701,"date":3702,"series":3648,"seriesOrder":3703},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-19","软件分析与设计笔记 19：规范化与逻辑数据模型","一次改地址引发的数据不一致，讲清规范化的真正动机；UNF 到 3NF 每一步在解决什么问题，派生字段为什么不能存，优化为什么和规范化方向相反，以及逻辑数据模型在 3NF 之上补了什么。","2026-11-10",19,{"path":3705,"title":3706,"description":3707,"date":3708,"series":3648,"seriesOrder":3709},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-18","软件分析与设计笔记 18：数据库分析：实体、关系与数据字典","为什么不能拿到需求就动手建表：实体与关系怎么判定、基数为什么必须由业务方确认、数据命名要遵守什么规则，以及数据字典四列里最容易被空着的那一列。","2026-11-09",18,{"path":3711,"title":3712,"description":3713,"date":3714,"series":3648,"seriesOrder":3187},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-17","软件分析与设计笔记 17：用生成式 AI 做设计与开发：能用的场景与要防的坑","生成式 AI 在工作流里真正站得住的三个场景 —— 造示例数据、解释陌生代码、起草初稿；它为什么会复现社会偏见、为什么会编得像真的，以及哪些内容绝不能直接采用。","2026-11-08",{"path":3716,"title":3717,"description":3718,"date":3719,"series":3648,"seriesOrder":3178},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-16","软件分析与设计笔记 16：从 persona 到 URS：一份交付物的完整骨架","把前面十几篇串成一份能交出去的东西：用户需求规格说明书的九个部分、每一章来自哪个环节、由谁确认，以及面向决策者的提案该讲清哪三件事。","2026-11-07",{"path":3721,"title":3722,"description":3723,"date":3724,"series":3648,"seriesOrder":3172},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-15","软件分析与设计笔记 15：非功能需求：把「快、稳、安全」变成数字","为什么「系统要快」不是一条需求：非功能需求怎么量化，决定性能的用户量、交易量、数据量三张表怎么估，安全需求要写清什么，以及可靠性的「不可用」该怎么定义。","2026-11-06",{"path":3726,"title":3727,"description":3728,"date":3729,"series":3648,"seriesOrder":2260},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-14","软件分析与设计笔记 14：软件测试：层级、方法与等价类划分","「我们测过了」这句话问题在哪：为什么静态评审和动态测试缺一不可，五个测试层级各自验证什么，白盒与黑盒的差别，以及用等价类划分和边界值把无限输入变成有限用例的方法。","2026-11-05",{"path":3731,"title":3732,"description":3733,"date":3734,"series":3648,"seriesOrder":1215},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-13","软件分析与设计笔记 13：需求获取：五种调查方法与一场访谈","需求从哪里来：五种事实调查方法各自适合回答什么、代价是什么，访谈从准备到记录的全过程，问卷设计里最容易犯的错，以及访谈记录必须写下来的那几项信息。","2026-11-04",{"path":3736,"title":3737,"description":3738,"date":3739,"series":3648,"seriesOrder":1200},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-12","软件分析与设计笔记 12：前端设计：把流程变成屏幕","界面设计不是「画得好看」：从活动图走到屏幕的三步，CRUD 任务流怎么当检查表，界面必须回答的三个问题，信息架构与五种导航类型，视觉一致性与留白，以及移动端与 Web 端的差别。","2026-11-03",{"path":3741,"title":3742,"description":3743,"date":3744,"series":3648,"seriesOrder":1183},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-11","软件分析与设计笔记 11：Agentic AI 与业务流程自动化","AI agent 到底是什么：五项能力与四个核心组件，什么场景该用定时任务、什么该用程序、什么才值得用 agent，两种实现路径的差别，必须提前防住的四类失败模式，以及设计方法从提示词到编排的演进。","2026-11-02",{"path":3746,"title":3747,"description":3748,"date":3749,"series":3648,"seriesOrder":1168},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-10","软件分析与设计笔记 10：精炼用例模型：include、extend 与泛化","三种精炼用例关系的判断标准：include 什么时候用、它和 extend 的区别到底在哪、参与者泛化与用例泛化各解决什么问题，以及精炼到什么程度就该停手。","2026-11-01",{"path":3751,"title":3752,"description":3753,"date":3754,"series":3648,"seriesOrder":1144},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-09","软件分析与设计笔记 09：功能需求（二）：从流程到业务实体","活动图画完之后，怎么从流程里筛出真正的业务实体：三条判断标准、哪些名词其实不该建实体、属性从哪里来，以及领域模型和后面的数据模型分别负责什么。","2026-10-31",{"path":3756,"title":3757,"description":3758,"date":3759,"series":3648,"seriesOrder":1131},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-08","软件分析与设计笔记 08：功能需求（一）：用例模型与活动图","从用户故事到用例的翻译过程：什么才算「好」的参与者，系统边界怎么划，用例描述必须写清哪四件事，活动图怎么把分支、并行与泳道画清楚，以及这两个图在 draw.io 里各用哪个形状、最容易画错哪一笔。","2026-10-30",{"path":3761,"title":3762,"description":3763,"date":3764,"series":3648,"seriesOrder":706},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-07","软件分析与设计笔记 07：用户故事：把需求写成可验收的一句话","用户故事的三段结构，怎么从用户画像和数据地图里把它提取出来，一条故事多大算合适、时序为什么也是需求的一部分，以及验收标准怎么写才算真的可验收。","2026-10-29",{"path":3766,"title":3767,"description":3768,"date":3769,"series":3648,"seriesOrder":676},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-06","软件分析与设计笔记 06：范围界定（数据侧）：用数据校验你的判断","访谈结论和数字对不上时该怎么办：分析的四个层次分别在回答什么问题、为什么不能跳级、数据准备与搜集怎么做成一张应用地图，以及数据最容易在哪几个地方骗你。","2026-10-28",{"path":3771,"title":3772,"description":3773,"date":3774,"series":3648,"seriesOrder":650},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-05","软件分析与设计笔记 05：范围界定（用户侧）：用户画像与客户旅程图","为什么「所有用户」是一个陷阱，项目边界该怎么划，用户画像要写哪五个要素、最容易写成什么废纸，客户旅程图怎么把阶段、想法和情绪画在同一张纸上，以及怎么从这两样东西一步步推到可验证的需求。","2026-10-27",{"path":3776,"title":3777,"description":3778,"date":3779,"series":3648,"seriesOrder":529},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-04","软件分析与设计笔记 04：接手陌生案例的第一步：三问与一张表","拿到一个完全陌生的业务案例，怎么从零开始不跑偏：只问 Who、What、Why 三个问题，把「问题—事实—假设—理由」记成一张四列表，说清为什么假设必须写明理由，以及带着问题进访谈为什么比空手去有效得多。","2026-10-26",{"path":3781,"title":3782,"description":3783,"date":3784,"series":3648,"seriesOrder":337},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-03","软件分析与设计笔记 03：Agile 与 Scrum：迭代、角色与产出物","从「三周做完交付，客户说这不是我要的」讲起，说清瀑布式与迭代式的根本差别，Scrum 的三个角色和三种产出物，一个 sprint 里四次固定活动各自在解决什么问题，以及敏捷里最常见的几个误解。","2026-10-25",{"path":3786,"title":3787,"description":3788,"date":3789,"series":3648,"seriesOrder":283},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-02","软件分析与设计笔记 02：设计思维、用户驱动与数据驱动","从「客服要一个能一次看完所有排期的界面」这个翻车案例讲起，说清设计思维到底是什么、用户驱动与数据驱动各自能看见什么又看不见什么、为什么真正的落点是把两者合起来的 data-informed design，以及访谈中怎么问出有用的信息。","2026-10-24",{"path":3791,"title":3792,"description":3793,"date":3794,"series":3648,"seriesOrder":272},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-01","软件分析与设计笔记 01：课程地图与从需求到设计的主干","这一篇不写具体方法，先把整条链路铺开：软件分析与设计到底要解决什么问题，从需求到设计分成哪两段，中间有哪十几个环节，一份完整的交付物里应该有什么，以及后面 27 篇笔记怎么排、新人该按什么顺序读。","2026-10-23",{"path":3796,"title":3797,"description":3798,"date":3799,"series":3800,"seriesOrder":272},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-01","Spring 学习笔记 01：IoC、依赖注入与第一个 Spring Boot 应用","从「手写 new 出来的三层结构」的痛点讲起，说清 IoC 容器、Bean 与依赖注入是怎么回事，再用 Maven 与 Spring Initializr 跑起第一个能返回 JSON 的应用。","2026-10-15","Spring 学习笔记",{"path":3802,"title":3803,"description":3804,"date":3799,"series":3800,"seriesOrder":283},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-02","Spring 学习笔记 02：Spring Data JPA 基础——实体映射与 Repository","用 ORM 把类映射到表：@Entity、@Id、@GeneratedValue 怎么用，CrudRepository 三层接口怎么选，H2 与 MySQL 怎么配，以及 ddl-auto 到底该写哪个值。",{"path":3806,"title":3807,"description":3808,"date":3799,"series":3800,"seriesOrder":337},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-03","Spring 学习笔记 03：JPA 查询——派生方法、JPQL 与分页排序","Repository 自带的方法只够按主键查，这篇讲三种自己造查询的方式：方法名派生、@Query 写 JPQL、原生 SQL，以及 Pageable 分页排序和投影返回。",{"path":3810,"title":3811,"description":3812,"date":3799,"series":3800,"seriesOrder":529},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-04","Spring 学习笔记 04：JPA 关联映射与仓储测试","一对多、多对多怎么映射，谁负责维护外键，FetchType 与 CascadeType 该怎么选，顺带用 @DataJpaTest 与 AssertJ 把仓储层测起来。",{"path":3814,"title":3815,"description":3816,"date":3799,"series":3800,"seriesOrder":650},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-05","Spring 学习笔记 05：Spring MVC 与 Thymeleaf 入门","一次页面请求在 Spring MVC 里走了哪几步，@Controller 怎么把数据交给模板，@PathVariable 与 @RequestParam 怎么取参数，以及控制器为什么必须是无状态的。",{"path":3818,"title":3819,"description":3820,"date":3799,"series":3800,"seriesOrder":676},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-06","Spring 学习笔记 06：表单绑定与服务端校验","把表单字段绑到对象上，用 Bean Validation 注解做服务端校验，把错误信息显示回用户刚填的那一页，再补上自定义校验注解与全局异常处理。",{"path":3822,"title":3823,"description":3824,"date":3799,"series":3800,"seriesOrder":706},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-07","Spring 学习笔记 07：Thymeleaf 片段复用与国际化","用 th:fragment 与 th:insert\u002Fth:replace 把导航栏、页脚抽成片段，页面套用统一布局，再用 messages.properties 与 LocaleResolver 做中英文切换。",{"path":3826,"title":3827,"description":3828,"date":3799,"series":3800,"seriesOrder":1131},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-08","Spring 学习笔记 08：HTTP Session 与会话状态管理","HTTP 无状态带来的问题，Cookie 与 Session 怎么分工，Spring 里读写会话的几种方式，以及会话固定、超时、多实例共享这些必须想清楚的事。",{"path":3830,"title":3831,"description":3832,"date":3799,"series":3800,"seriesOrder":1144},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-09","Spring 学习笔记 09：拦截器 HandlerInterceptor","登录检查、权限判断、请求耗时统计这类横切逻辑该放哪：HandlerInterceptor 的三个回调各在什么时机执行，怎么注册与排除路径，以及它和过滤器的分工。",{"path":3834,"title":3835,"description":3836,"date":3799,"series":3800,"seriesOrder":1168},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-10","Spring 学习笔记 10：Service 层与事务","一组数据库操作要么全成功要么全失败，靠 @Transactional 怎么做到；传播行为、隔离级别、回滚规则怎么选，以及自调用失效、乐观锁悲观锁这些实战里的坑。",{"path":3838,"title":3839,"description":3840,"date":3799,"series":3800,"seriesOrder":1183},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-11","Spring 学习笔记 11：REST API 基础——把 Service 暴露成接口","同一套 Service 怎么同时服务页面和客户端：@RestController 的路由与方法语义、状态码怎么给、DTO 怎么定，以及 MockMvc 端到端和切片测试的两种写法与各自的坑。",{"path":3842,"title":3843,"description":3844,"date":3799,"series":3800,"seriesOrder":1200},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-12","Spring 学习笔记 12：REST 进阶——版本、更新、跨域与文档化","接口能跑通之后要处理的几件事：URL 与响应结构怎么定、版本怎么演进、更新怎么做到可安全重试、CORS 怎么配、HATEOAS 与 Spring Data REST 该不该用。",{"path":3846,"title":3847,"description":3848,"date":3849,"series":3850,"seriesOrder":529},"\u002Fposts\u002Fjava\u002Fjava-functionalprogramming-notes","Java 函数式编程笔记：Lambda、函数式接口与 Streams","学习 Java 函数式编程时的个人笔记：Lambda 表达式的五步简写与方法引用、常见函数式接口、Stream 流水线与惰性求值，以及创建流、中间操作、终止操作与收集器的用法。示例代码均为自写，运行结果来自本地实测。","2026-10-13","Java 学习笔记",{"path":3852,"title":3853,"description":3854,"date":3849,"series":3850,"seriesOrder":337},"\u002Fposts\u002Fjava\u002Fjava-generics-notes","Java 泛型笔记：泛型方法、有界类型与泛型类","学习 Java 泛型时的个人笔记：从重复的重载方法与多态尝试讲起，再到泛型方法与类型推断、有界泛型类型、Comparable 与 Number 边界，以及泛型类在集合中的用法。示例代码均为自写，运行结果来自本地实测。",{"path":3633,"title":5,"description":3629,"date":3628,"series":3635,"seriesOrder":529},{"path":3857,"title":3858,"description":3859,"date":3628,"series":3635,"seriesOrder":650},"\u002Fposts\u002Fmysql\u002Fmysql-learning-05","MySQL 学习笔记 05：DDL 概览","MySQL 学习笔记第五篇：数据定义语言概览——Schema、Table、View、Index、Constraints 这几类对象分别对应哪些 CREATE \u002F ALTER \u002F DROP 命令。",{"path":3861,"title":3862,"description":3863,"date":3628,"series":3635,"seriesOrder":676},"\u002Fposts\u002Fmysql\u002Fmysql-learning-06","MySQL 学习笔记 06：CREATE TABLE 与数据类型","MySQL 学习笔记第六篇：CREATE TABLE 的完整语法、常用数据类型的选型建议，以及外键的两种定义方式。",{"path":3865,"title":3866,"description":3867,"date":3628,"series":3635,"seriesOrder":706},"\u002Fposts\u002Fmysql\u002Fmysql-learning-07","MySQL 学习笔记 07：索引","MySQL 学习笔记第七篇：索引的作用与 B+ 树结构、单列与复合索引的创建、索引的代价与适用场景。",{"path":3869,"title":3870,"description":3871,"date":3628,"series":3635,"seriesOrder":1131},"\u002Fposts\u002Fmysql\u002Fmysql-learning-08","MySQL 学习笔记 08：DROP 与 ALTER","MySQL 学习笔记第八篇：DROP 删除数据库对象、ALTER 修改表结构，以及常见的坑。",{"path":3873,"title":3874,"description":3875,"date":3628,"series":3635,"seriesOrder":1144},"\u002Fposts\u002Fmysql\u002Fmysql-learning-09","MySQL 学习笔记 09：约束与数据完整性","MySQL 学习笔记第九篇：SQL 约束——NOT NULL、CHECK、PRIMARY KEY、FOREIGN KEY 等如何保证数据完整性，以及它们的对比。",{"path":3877,"title":3878,"description":3879,"date":3628,"series":3635,"seriesOrder":1168},"\u002Fposts\u002Fmysql\u002Fmysql-learning-10","MySQL 学习笔记 10：视图","MySQL 学习笔记第十篇：视图（Views）的定义与特性、和表的对比、创建与使用，以及可更新视图的限制。",{"path":3881,"title":3882,"description":3883,"date":3628,"series":3635,"seriesOrder":1183},"\u002Fposts\u002Fmysql\u002Fmysql-learning-11","MySQL 学习笔记 11：存储过程","MySQL 学习笔记第十一篇：存储过程（Stored Procedures）的概念、创建与调用、带参数的写法，以及优缺点。",{"path":3885,"title":3886,"description":3887,"date":3888,"series":3635,"seriesOrder":272},"\u002Fposts\u002Fmysql\u002Fmysql-learning-01","MySQL 学习笔记 01：MySQL 基础知识","MySQL 学习笔记第一篇：MySQL Server 与 Workbench 的安装，数据库与 DBMS 的基本概念，关系模型、ACID 事务、常见数据类型，以及后续的学习路线。","2026-10-09",{"path":3890,"title":3891,"description":3892,"date":3888,"series":3635,"seriesOrder":283},"\u002Fposts\u002Fmysql\u002Fmysql-learning-02","MySQL 学习笔记 02：SELECT 查询与过滤","MySQL 学习笔记第二篇：SELECT 的基本语法与逻辑执行顺序，WHERE 过滤（比较、LIKE、IN、BETWEEN、NULL）、各种 JOIN、UNION 与子查询。",{"path":3894,"title":3895,"description":3896,"date":3888,"series":3635,"seriesOrder":337},"\u002Fposts\u002Fmysql\u002Fmysql-learning-03","MySQL 学习笔记 03：聚合、分组与输出控制","MySQL 学习笔记第三篇：COUNT\u002FSUM\u002FAVG 等聚合函数、GROUP BY 分组、HAVING 过滤、ORDER BY 与 LIMIT，以及一条 SELECT 的完整逻辑执行顺序。",{"path":3898,"title":3899,"description":3900,"date":3901,"series":3850,"seriesOrder":283},"\u002Fposts\u002Fjava\u002Fjava-oop-notes","Java 面向对象笔记：类、继承、多态与异常","学习 Java 面向对象编程时的个人笔记：类与对象、封装与访问修饰符、继承与多态、集合、抽象类与接口、异常处理。示例代码均为自写，运行结果来自本地实测。","2026-10-06",{"path":3903,"title":3904,"description":3905,"date":3906,"series":3850,"seriesOrder":272},"\u002Fposts\u002Fjava\u002Fjava-basics-notes","Java 基础语法笔记：从环境安装到方法与数组","学习 Java 基础语法时的个人笔记：JDK 安装、输入输出、变量与运算符、条件与循环、字符串、数组与方法。示例代码均为自写，运行结果来自本地实测。","2026-10-05",{"path":3908,"title":3909,"description":3910,"date":3911,"series":3912,"seriesOrder":272},"\u002Fposts\u002Fgit\u002Fgit-install-and-basics","Git 安装与基本使用","从装好 Git 到跑通日常提交流程，把最常用的几条命令和它们背后的三个区域讲清楚。","2026-10-04","Git 入门",{"path":3914,"title":3915,"description":3916,"date":3911,"series":3912,"seriesOrder":283},"\u002Fposts\u002Fgit\u002Flocal-remote-repository","本地远程仓库的部署","用自己的机器当 Git 服务器：建一个裸仓库、走 SSH 连上去，把本地提交推上去。",{"path":3918,"title":3919,"description":3920,"date":3911,"series":3921,"seriesOrder":272},"\u002Fposts\u002Fguide\u002Fguide-file-layout","文件都放在哪","文章、图片、封面分别放在仓库的什么位置，哪些目录可以放手改、哪些碰了会出问题。","博客使用指南",{"path":3923,"title":3924,"description":3925,"date":3911,"series":3921,"seriesOrder":283},"\u002Fposts\u002Fguide\u002Fguide-frontmatter","frontmatter 每个字段是什么意思","文章开头那段被横线包住的字段，逐个说明作用、默认行为和写错的后果。",{"path":3927,"title":3928,"description":3929,"date":3911,"series":3921,"seriesOrder":337},"\u002Fposts\u002Fguide\u002Fguide-markdown","正文怎么写 —— Markdown 与排版效果","标题、链接、图片、代码、表格分别怎么写，以及本站对它们做了哪些自定义处理。",1793268153450]