# `newId` (function)

> 生成27位纯数字的ID 模仿后台Java代码生成


- **Type:** FUNCTION
- **Returns:** `varchar(32)`
- **Deterministic:** NO
- **SQL data access:** CONTAINS SQL

## Parameters

| # | Mode | Name | Type |
|---|---|---|---|

## Body

_Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE FUNCTION `newId`'`._

## Narrative

**Business context:** 生成27位纯数字的ID 模仿后台Java代码生成 — canonical primary-key generator on the SQL side. Mirrors xly's Java-side `Sid.java` "all-numeric 27-char id" convention so a `CALL` inside a stored proc / form `sSqlStr` produces an `sId` indistinguishable from one minted by `BusinessBaseService.add(...)`. Whenever a routine has to insert a row but the caller didn't pass a guid, it uses this.

**What it does:** returns `CONCAT( DATE_FORMAT(NOW(),'%Y%m%d%H%i%s') , CEILING(RAND()*9e7+1e7) , CEILING(RAND()*9e9+1e9) )` — a 14-char timestamp prefix + an 8-digit and a 10-digit random suffix, producing 32 numeric digits as a `varchar(32)`. Caveat: collision probability is non-zero (RAND-based), and the catalog header claims 27 digits while the body yields 32 — the gap matters when callers truncate or hash the id.

**Invocation:** referenced by **137 stored routines** — every `Sp_Ai_*`, `Sp_addBtn_gdsmodle`, `sp_addCustomer`, `Sp_Add_Flow`, `Sp_Bill_Force_Complete`, `Sp_calc_*storeLimit`, `Sp_Calc_sWod`, `Sp_Cashier_*Journal`, `Sp_Check_s*` insert-path, `Sp_Con_*Reset`, `Sp_CostAccount_CostCarryForward`, `Sp_DailyStatisticalReport`, `init_plc_config`, `sendPlcData`, plus 4 forms (`sSqlStr` / `sConfigSqlStr` direct embeds). Java callers in xly-src: `SupplierInventoryServiceImpl`, `PlcServiceImpl`, `SearchGroupbyServiceImpl`. Also embedded in upgrade scripts under `script/标版/upgrade/`. Sibling: `NewId2`.
